AccountManager GetUserData Restituisce NULL Nonostante sia stato impostato
-
11-12-2019 - |
Domanda
Sto lavorando su un'app Android che utilizza il AccountManager per memorizzare account e credenziali.Un problema che ho avuto è quello che anche se passerò in un grappolo di valori di stringa ai ACQUETTOPACKAKEXFITTIVALMENTE Bundle Data.
Ho controllato per assicurarmi che il pacchetto sia non vuoto e che contiene i valori prima di aggiungere l'account.E la maggior parte delle volte questo è il caso, ma ogni volta ogni tanto, ottengo null quando interrogo questi valori.
I valori di ritorno NULL sono più comuni dopo aver appena eliminato l'account e ri-aggiunto.
Sto facendo la mia query all'interno del metodo OnSaccountupondSupdato di AN OnSaccountupondAtelistener implementazione, quindi l'account dovrebbe essere aggiunto e buono per andare, giusto?
Grazie per qualsiasi aiuto
autenticatattività
.
// in the AuthenticatorActivity
Bundle userData = new Bundle();
userData.put (k1, v1);
userData.put (k2, v2);
userData.put (k3, v3);
userData.put (k4, v4);
userData.put (k1, v1);
Account a = new Account ("acc name", "com.account.type");
AccountManager am = AccountManager.get(this);
OnAccountsUpdateListener listener = new OnAccountsUpdateListener() {
@Override
public void onAccountsUpdated(Account[] accounts) {
Account mine = findAccount(accounts, account); // match account name
notifySignedIn(mine); // tell the world you're signed in
am.removeOnAccountsUpdatedListener(this);
}
};
am.addOnAccountsUpdatedListener(listener, handler, false);
am.addAccountExplicitly(a, "themostsecurepwintheworld", userData);
Alcuni altri filetti
.AccountManager am = AccountManager.get(mContext);
final string value2 = am.getUserData(mAccount, k2);
if (TextUtils.isEmpty(value2)) {
Log.d("WTF", "value is empty");
}
Soluzione
Sono a conoscenza di un bug in Honeycomb Plus che può causare il tuo problema.Se si tenta di GetUserData dell'account prima che sia registrato tutte le successive chiamate GetUserData restituiranno NULL.
Se guardi il codice.AccountManager ha una cache in memoria che è supportata da un database SQLite.Chiamare GetUserData popola la cache IN-Memory UserData, anche se non è registrata.Se non è registrato interpreta questo come nessun utenteData.La registrazione di un account popola solo il database e non invalida l'archivio in-memory.
Questo potrebbe causare il problema.
La soluzione alternativa è quella di rimuovere l'account prima di chiamare ADDACCOUNTSEXPLICT.
Ya questo problema succhia ed è un enorme bug in accountManger IMO e consente a terze parti di Essence DOS la tua app.
Altri suggerimenti
Stai utilizzando un dispositivo HTC con Android 4?Ho ricevuto molte segnalazioni di questo problema dagli utenti delle mie app di sincronizzazione. Tutto di loro ha utilizzato un dispositivo HTC con il livello SDK 15.
Sembra un bug HTC per me.
Diversi utenti hanno riferito che il problema è svanito dopo un riavvio.
Aggiornamento: Nel frattempo abbiamo trovato una soluzione adeguata, vedere https://stackoverflow.com/a/29776224/1558654
I had a similar issue, but my problem turned out to be attempting to store a long userData value instead of a String. Converting my long to a string for storage, and parsing it into a long again when pulling it out did the trick for me.