ejemplo abstractthreadedsyncadapter android android-syncadapter android-account android-authenticator

android - abstractthreadedsyncadapter - ¿Por qué AccountManager.addAccountExplicitly devuelve false?



abstractthreadedsyncadapter android (3)

¡Asegúrate de estar 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 }

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

Devoluciones

Verdadero si la cuenta se agregó con éxito, falso si la cuenta ya existe, la cuenta es nula o se produce otro error

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


AccountManagerService es el servicio real del sistema que administra las cuentas, mientras que AccountManager es solo un proxy que oculta todo lo relacionado con los servicios vinculados debajo del capó.

El siguiente código fuente del método addAccountInternal de AccountManagerService es bastante autoexplicativo, excepto que si pasa null para la account se IllegalArgumentException lugar de la ejecución de 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; }

Línea inferior: addAccountExplicitly devolverá false si ya existe la cuenta requerida o si algún error de la base de datos SQLite impidió el almacenamiento de información relacionada con la cuenta en la base de datos.


false if the account already exists

Sin ningún tipo de información proporcionada, esta podría ser la razón por la que está recibiendo información falsa