¿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
- Detener el adaptador de sincronización para sincronizar inicialmente cuando se utiliza addPeriodicSync
- AccountManager no agrega una cuenta personalizada en la vista previa de Android N
- El adaptador de sincronización programado se ejecuta cada 30 segundos
- Sincronización de varios proveedores con un SyncAdapter
- Algunas preguntas sobre el permiso "USE_CREDENTIALS"
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?
- Ocultar la cuenta ficticia para el adaptador de sincronización de la configuración
- Adaptador de sincronización de contactos en android
- ¿Cómo configurar correctamente el syncAdapter?
- ¿Por qué ContentResolver.requestSync no activa una sincronización?
- Cómo manejar llamadas REST, persistencia de datos, sincronización y observación de ContentProvider
- Servidor SyncAdapter y Rest con respuesta paginada
- Cómo definir la frecuencia de las actualizaciones de SyncAdapter en android?
- Sincronización personalizada que no funciona con la cuenta de Google (com.google) en algunos dispositivos Samsung
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: muestra texto en el centro de la barra de progreso
- Recyclerview + Proveedor de contenido + CursorLoader