Проблема с использованием android.accounts Authenticator - PullRequest
2 голосов
/ 19 мая 2011

Я новичок в apis android.accounts, и теперь я пытаюсь что-то с ними сделать, но возникает, кажется, фиктивная проблема ...
Я создал Authenticator для своего приложения, но еще не реализовал абстрактные методы. Его значок успешно появляется в системном окне «Добавить учетную запись», и я знаю, что когда я щелкаю по нему, вызывается метод addAccount в Authenticator.

Теперь я хочу сделать несколько простых вещей в этом методе и написать следующие коды:

    @Override
public Bundle addAccount(AccountAuthenticatorResponse response,
        String accountType, String authTokenType, String[] requiredFeatures,
        Bundle options) {

    Log.d(LOG_TAG, "RRAuthenticator add account... ");
    String accountName = "example@example.com";
    Account account = new Account(accountName, accountType);
    String password = "example_password";
    AccountManager manager = AccountManager.get(context);
    manager.addAccountExplicitly(account, password, null);

    Bundle bundle = new Bundle();
    bundle.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
    bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
    bundle.putString(AccountManager.KEY_AUTHTOKEN, "example_authtoken");
    return bundle;
}

Я видел демонстрационную версию SampleSyncAdapter и делаю подобные шаги. Но я практикую использование этих API, напрямую добавляя аккаунт. Но система рухнула по линии manager.addAccountExplicitly(account, password, null); Что с ним не так?


Добавлено позже: Исключение в системном процессе. Система рухнет. NullPointerException бросить AccountManager. Кажется, проблема в методе addAccountExplicitly, так как я комментирую это утверждение, сбоев не происходит.

Ответы [ 2 ]

1 голос
/ 21 мая 2011

Я разобрался.

Оказывается, это ошибка в Android 2.0.
Если вы добавляете учетную запись в AccountManager, вы должны также предоставить SynAdapter для этой учетной записи на платформе Android 2.0,Но все хорошо под Android 2.1 и выше.

Это известная проблема, обратитесь к:
http://code.google.com/p/android/issues/detail?id=5009
и
AccountManager без SyncAdapter?

0 голосов
/ 19 мая 2011
 Account account = new Account(username, AuthConstants.ACCOUNT_TYPE);
            if (am.addAccountExplicitly(account, password, null)) {
                result = new Bundle();
                ContentResolver.setSyncAutomatically(account, DB.AUTHORITY, true);
                result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
                result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
                return result;
            } 

Я использую этот код в одном из моих приложений, который работает отлично. ключом здесь является AccountAuthenticatorActivity, которое должно устанавливать пакет результатов аутентификации, который должен быть зарегистрирован (адаптер синхронизации от разработчиков Android имеет это.

также вот мой метод addAccount для сервиса accountAuthentication

    @Override
public Bundle addAccount(AccountAuthenticatorResponse response,
    String accountType, String authTokenType, String[] requiredFeatures,
    Bundle options) {
    final Intent intent = new Intent(mContext, LoginScreen.class);
    intent.putExtra(LoginScreen.PARAM_AUTHTOKEN_TYPE,
        authTokenType);
    intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
        response);
    final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);
    return bundle;
}

UPDATE

Authenticator

Вот ссылка, которую я использовал. это хороший проект. Я верю, что это из приложения для Android last.fm. он также имеет открытый код на git, я верю. так что попробуй с этим сравнить.

РАЗРЕШЕНИЯ

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
  <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
  <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
  <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
  <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
  <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
...