Подтвердить что ты не робот

Почему AccountManager.addAccountExplicitly возвращает false?

Google Android docs (http://developer.android.com/reference/android/accounts/AccountManager.html#addAccountExplicitly (android.accounts.Account, java.lang.String, android.os.Bundle)):

Возвращает

Истинно, если учетная запись была успешно добавлена, false, если учетная запись уже существует, учетная запись равна null или возникает другая ошибка.

Я становлюсь ложным. В частности, какие другие ошибки могут вызвать это?

4b9b3361

Ответ 1

false if the account already exists

Без какой-либо информации это может быть причиной того, что вы получаете ложь

Ответ 2

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

Ниже приведен исходный код метода addAccountInternal из AccountManagerService довольно понятен, за исключением того, что если вы передадите null для account, то вместо выполнения этого метода будет выбрано IllegalArgumentException:

private boolean addAccountInternal(UserAccounts accounts, Account account, String password,
        Bundle extras, boolean restricted, int callingUid) {
    if (account == null) {
        return false;
    }
    synchronized (accounts.cacheLock) {
        final SQLiteDatabase db = accounts.openHelper.getWritableDatabase();
        db.beginTransaction();
        try {
            long numMatches = DatabaseUtils.longForQuery(db,
                    "select count(*) from " + TABLE_ACCOUNTS
                            + " WHERE " + ACCOUNTS_NAME + "=? AND " + ACCOUNTS_TYPE+ "=?",
                    new String[]{account.name, account.type});
            if (numMatches > 0) {
                Log.w(TAG, "insertAccountIntoDatabase: " + account
                        + ", skipping since the account already exists");
                return false;
            }
            ContentValues values = new ContentValues();
            values.put(ACCOUNTS_NAME, account.name);
            values.put(ACCOUNTS_TYPE, account.type);
            values.put(ACCOUNTS_PASSWORD, password);
            values.put(ACCOUNTS_LAST_AUTHENTICATE_TIME_EPOCH_MILLIS, System.currentTimeMillis());
            long accountId = db.insert(TABLE_ACCOUNTS, ACCOUNTS_NAME, values);
            if (accountId < 0) {
                Log.w(TAG, "insertAccountIntoDatabase: " + account
                        + ", skipping the DB insert failed");
                return false;
            }
            if (extras != null) {
                for (String key : extras.keySet()) {
                    final String value = extras.getString(key);
                    if (insertExtraLocked(db, accountId, key, value) < 0) {
                        Log.w(TAG, "insertAccountIntoDatabase: " + account
                                + ", skipping since insertExtra failed for key " + key);
                        return false;
                    }
                }
            }
            db.setTransactionSuccessful();

            logRecord(db, DebugDbHelper.ACTION_ACCOUNT_ADD, TABLE_ACCOUNTS, accountId,
                    accounts, callingUid);

            insertAccountIntoCacheLocked(accounts, account);
        } finally {
            db.endTransaction();
        }
        sendAccountsChangedBroadcast(accounts.userId);
    }
    if (accounts.userId == UserHandle.USER_OWNER) {
        addAccountToLimitedUsers(account);
    }
    return true;
}

Нижняя строка: addAccountExplicitly вернет false, если либо требуемая учетная запись уже существует, либо какая-либо ошибка базы данных SQLite предотвратила хранение связанной с учетной записью информации в базе данных.

Ответ 3

Убедитесь, что вы подключены к интернету! В моем случае это была проблема!

if (accountManager.addAccountExplicitly(_account, null, null)) {
       System.out.println("_add account if");
   }else {
      // This block is also executed in case device has no internet connection
}