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