Android应用程序在addAccountExplicitly(帐户,密码,null)崩溃;

时间:2015-10-21 22:55:03

标签: android

成功进行基本身份验证后,我想添加一个帐户供以后使用。当我尝试使用以下代码创建此帐户时:

AccountManager accountManager = AccountManager.get(getBaseContext());
final Account basicAccount = new Account(mEmail, "com.example");
accountManager.addAccountExplicitly(basicAccount, mPassword, null);

当调用addAccountExplicitly(...)时,应用程序崩溃并出现以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: Process: com.example, PID: 19094
E/AndroidRuntime: java.lang.SecurityException: uid 10107 cannot explicitly add accounts of type: com.example
E/AndroidRuntime:     at android.os.Parcel.readException(Parcel.java:1599)
E/AndroidRuntime:     at android.os.Parcel.readException(Parcel.java:1552)
E/AndroidRuntime:     at android.accounts.IAccountManager$Stub$Proxy.addAccountExplicitly(IAccountManager.java:890)
E/AndroidRuntime:     at android.accounts.AccountManager.addAccountExplicitly(AccountManager.java:712)
E/AndroidRuntime:     at com.example.LoginActivity$UserLoginTask.onPostExecute(LoginActivity.java:244)
E/AndroidRuntime:     at com.example.LoginActivity$UserLoginTask.onPostExecute(LoginActivity.java:209)
E/AndroidRuntime:     at android.os.AsyncTask.finish(AsyncTask.java:651)
E/AndroidRuntime:     at android.os.AsyncTask.-wrap1(AsyncTask.java)
E/AndroidRuntime:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/ActivityManager:   Force finishing activity com.example/.LoginActivity

问题:

  1. 我确定我的AccountType与authenticator.xml中指定的相同。为什么我的代码会崩溃?
  2. 甚至可以使用AccountManager和Account进行基本身份验证吗?我无法找到一个很好的例子(他们都使用令牌......)
  3. 我的想法是将此帐户用于多个应用程序。使用服务进行身份验证(使用意图)是最佳做法吗?关于这个的任何好的教程?
  4. 谢谢,Ove

6 个答案:

答案 0 :(得分:25)

1)崩溃原因是因为AndroidManifest.xml中缺少以下代码段。

<service android:name="com.example.accounts.GenericAccountService">
    <intent-filter>
         <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" />
</service>

2)尽管仍然缺少最佳实践示例,但绝对有可能。

3)不知道。然而...

答案 1 :(得分:25)

在我的情况下,我发现我在设备上安装了另一个具有相同帐户名称和类型的应用程序,但使用的是我尝试安装的签名证书。

所以它崩溃了应用程序。

检查android doc方法addAccountExplicity,它说:

  

此方法要求调用者与其签名匹配   拥有指定帐户的身份验证者。

那是我的问题

答案 2 :(得分:15)

您使用"com.example"作为应用的唯一标识符,请检查"authenticator.xml"

中是否相同

答案 3 :(得分:4)

这可能是由于ACCOUNT_TYPE不匹配引起的。检查Class中的ACCOUNT_TYPE和authenticator.xml中的ACCOUNT_TYPE必须匹配

private static final String ACCOUNT_TYPE = "com.someonew.syncaccount";

authenticator.xml

 <?xml version="1.0" encoding="utf-8"?>
    <account-authenticator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:accountType="com.someonew.syncaccount"
        android:icon="@mipmap/ic_launcher_round"
        android:smallIcon="@mipmap/ic_launcher_round"
        android:accountPreferences="@xml/syncsettings"
        android:label="@string/app_name"/>

答案 4 :(得分:1)

对你的第三个问题没有一个黄金回应。

如果所有应用都使用相同的名称,您可以考虑使用某项服务,只需记住将其限制在您自己的应用中。

但是,用户可能会对安装应用程序后立即登录感到困惑,因此我建议允许用户在每个单独的应用程序中登录。您可以在Google Developer Console中为同一个应用生成多个单独的私钥,从而在每个应用中获得相同的用户LOCAL_ID。

答案 5 :(得分:0)

在我的情况下,我的软件包名称包含大写字母,因此服务未在Android Manifest中注册,因此发生了问题。

android:name="com.SyncServices.SyncService" 

更改为

android:name="com.syncservices.SyncService"