¿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 } 
  • Evitar el bucle de sincronización de red al sincronizar desde la red en Android ContentProvider
  • Múltiples Syncadapters en la misma aplicación
  • Artículos de adaptador de sincronización para Android múltiples como Cuenta de Google?
  • SyncAdapter: Cuenta creada, requestSync OK, pero setSyncAutomatically no funciona
  • Cambiar el nombre de usuario y la contraseña de la cuenta personalizada de Android
  • OnPerformSync () se llama varias veces
  • Cómo agregar una etiqueta de aplicación personalizada en la aplicación de contacto androide nativa?
  • ¿Cómo señalar la sincronización completa al Android SyncManager?
  • Opciones de SyncAdapter
  • ¿Cómo sincronizar los datos del servidor en la aplicación android?
  • No se puede obtener SyncAdapter para trabajar en Xamarin
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.