¿Por qué AccountManager.addAccount puede devolver false de forma explícita?

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

Devoluciones

Verdad si la cuenta se ha agregado correctamente, false si la cuenta ya existe, la cuenta es nula o se produce otro error.

Me estoy volviendo falso. Específicamente, ¿qué otros errores podrían causar esto?

false if the account already exists 

Sin ninguna información proporcionada, esta podría ser la razón por la que estás recibiendo falsas

AccountManagerService es el servicio del sistema actual que administra las cuentas, mientras que AccountManager es sólo un proxy que oculta todas las cosas relacionadas con los servicios vinculados bajo la campana.

El siguiente código fuente del método addAccountInternal de AccountManagerService es prácticamente autoexplicativo, excepto que si pasas un null para la account se IllegalArgumentException lugar de ejecutar este método:

 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 devolverá false si ya existe la cuenta requerida, o algún error de la base de datos SQLite impidió el almacenamiento de la información relacionada con la cuenta en la base de datos.

Asegúrese de que está conectado a Internet ! En mi caso, este fue el problema!

 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 } 
  • Android: Cómo escuchar cambios de contacto como WhatsApp
  • Cómo ocultar mi Administrador de Acount personalizado desde la interfaz de usuario de configuración
  • Los puntos de interrupción de SampleSyncAdapter no funcionan
  • Sincronización de datos y sincronización manualmente. Calendario y contactos
  • ¿Por qué ContentResolver.requestSync no activa una sincronización?
  • Desiging una aplicación de Android con Sincronización sin conexión. ¿Debo usar SyncAdapter?
  • Cómo utilizar CALLER_IS_SYNCADAPTER correctamente
  • Syncadapter onPerformSync que se llama dos veces la primera vez
  • Ocultar la cuenta ficticia para el adaptador de sincronización de la configuración
  • Cómo añadir un evento en un calendario para Android
  • ¿Cómo notificar a la actividad de llamada cuando SyncAdapter ha finalizado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.