Сбой приложения Android на addAccountExplicitly (учетная запись, пароль, null);

После успешной базовой проверки подлинности я хочу добавить учетную запись для последующего использования. Когда я попытался создать эту учетную запись, используя следующий код:

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

Вопрос:

  • Я уверен, что мой тип AccountType тот же, что указан в моем authenticator.xml. Почему мой код разбился?
  • Возможно ли использовать учетную запись AccountManager и Account с базовой аутентификацией? Я не смог найти хороший пример для этого (все они используют токены...)
  • Моя идея - использовать эту учетную запись для нескольких приложений. Является ли использование службы аутентификации (с намерениями) лучшей практикой? Любые хорошие учебники по этому поводу?

Спасибо, Ove

Ответы

Ответ 1

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) Не знаю. Тем не менее,...

Ответ 2

В моем случае это происходило из-за того, что на устройстве было установлено другое приложение с тем же именем и типом учетной записи, но с другим сертификатом подписи, который я пытался установить.

Так что это было сбой приложения.

Проверяя документ Android на метод addAccountExplicity, он говорит:

Этот метод требует, чтобы вызывающая сторона имела совпадение подписи с аутентификатором, которому принадлежит указанная учетная запись.

Это была моя проблема

Ответ 3

Вы используете "com.example" в качестве уникального идентификатора для своего приложения, пожалуйста, проверьте, совпадает ли он с "authenticator.xml"

Ответ 4

Это может быть вызвано несоответствием ACCOUNT_TYPE. проверьте ACCOUNT_TYPE в классе и ACCOUNT_TYPE в authenticator.xml должны совпадать

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"/>

Ответ 5

Там нет ни одного золотого ответа на ваш третий вопрос.

Если все приложения используют одно и то же имя, вы можете рассмотреть сервис, просто не забудьте ограничить его своими приложениями.

Однако пользователь может запутаться в том, что он был подписан сразу после установки приложения, поэтому я бы рекомендовал разрешить пользователю входить в каждое отдельное приложение. Вы можете создать несколько отдельных закрытых ключей для одного и того же приложения в консоли разработчика Google и таким образом получить один и тот же LOCAL_ID пользователя в каждом приложении.