19

Android docs Google (http://developer.android.com/reference/android/accounts/AccountManager.html#addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle)) sagen:Warum könnte AccountManager.addAccountExplicitely false zurückgeben?

Returns

True, wenn das Konto erfolgreich hinzugefügt wurde, falsch, wenn das Konto bereits vorhanden ist, ist das Konto null oder ein anderer Fehler auftritt

Ich werde falsch. Welche anderen Fehler könnten das verursachen?

+0

War irgendetwas in der Protokollausgabe? Wird dies von der Anwendung oder den Authentifikatoren, die Sie geschrieben haben, aufgerufen? –

+0

können Sie Code-Snippet freigeben? – RBK

Antwort

6
false if the account already exists 

Ohne Informationen zur Verfügung gestellt, könnte dies der Grund sein, Sie werden immer falsch

0

AccountManagerService der aktuelle Systemdienst, die Konten verwaltet, während AccountManager ist nur ein Proxy, der all gebundenen-services-related stuff versteckt unter der Haube.

Die folgenden Quellcode addAccountInternal Methode von AccountManagerService ist ziemlich selbsterklärend, mit der Ausnahme, dass, wenn Sie null für account passieren, dann wird IllegalArgumentException anstelle der Ausführung dieser Methode geworfen werden:

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; 
} 

Bottom line: addAccountExplicitly gibt false zurück, wenn entweder das erforderliche Konto bereits vorhanden ist oder ein SQLite-Datenbankfehler die Speicherung von kontobezogenen Informationen in der Datenbank verhindert hat.

0

Stellen Sie sicher, dass Sie mit dem Internet verbunden sind! In meinem Fall war das das Problem!

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 
}