¿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
- Cuando SyncAdapter ejecuta la sincronización en android?
- Intervalo de ContentResolver.addPeriodicSync redondeado
- SyncAdapter no se sincroniza automáticamente
- ContentProvider no aparecerá en el área de datos y sincronización
- Android Sync Sqlite
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?
- Evitar el bucle de sincronización de red al sincronizar desde la red en Android ContentProvider
- Sincronización de un servicio REST con una aplicación de Android
- AccountManager.addAccountExplicitamente devuelve false en Algunos teléfonos Android
- ¿Cómo recuperar el tiempo de 'última sincronización' para una cuenta?
- ¿Cómo sincronizar los datos del servidor en la aplicación android?
- SyncAdapter no recibe llamadas en "Network tickle"
- Android Syncadapter no permitir que el usuario elija sincronizar o no sincronizar
- No se puede obtener SyncAdapter para trabajar en Xamarin
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