Как я могу добавить учетную запись с помощью AddAccountExplicitly?

Я нашел много вопросов по этой теме без ответа или с неработающей внешней ссылкой. Я хочу добавить учетную запись простым способом. Ошибка всегда одна и та же: java.lang.SecurityException: uid вызывающего абонента xxxxx отличается от uid аутентификатора (где я вызываю addAccountExplicitly). Но тип учетной записи одинаков в коде и xml, так что... где я делаю неправильно?

public class AuthActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auth);

        AccountManager accountManager = AccountManager.get(this);
        final Account account = new Account("username", getString(R.string.account_type));
        accountManager.addAccountExplicitly(account, "password", null);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="@string/account_type"
    android:icon="@drawable/ic_launcher"
    android:smallIcon="@drawable/ic_launcher"
    android:label="@string/name_app" />

person Michele Benolli    schedule 20.11.2014    source источник
comment
Просто чтобы убедиться, что вы пытаетесь добавить свой собственный тип учетной записи, а не учетную запись Google, Facebook или аналогичную?   -  person nibarius    schedule 21.11.2014
comment
Да, естественно, я пытаюсь добавить свой собственный тип учетной записи.   -  person Michele Benolli    schedule 21.11.2014


Ответы (2)


У меня была такая же проблема, как у вас. Оказалось, что я неправильно зарегистрировал свою службу аутентификации в файле манифеста приложений:

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

Имя вашего фильтра намерений определяется платформой Android. Так что это должно быть "android.accounts.AccountAuthenticator"

person marc    schedule 18.11.2016

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

Вы можете проверить, какой UID был назначен вашему приложению, просмотрев ApplicationInfo. .uid. Вы можете получить ApplicationInfo, используя getApplicationInfo() в PackageManager.

Вы можете настроить общий UID, используя android:sharedUserId в файле манифеста как для вашего аутентификатора, так и для вашего приложения.

person nibarius    schedule 21.11.2014