AccountManager getUserDataが設定されているにもかかわらずNULLを返す
-
11-12-2019 - |
質問
AccountManager を使用してアカウントと資格情報を保存するAndroidアプリに取り組んでいます。1つの問題を抱えていたのは、AccountManagerの addAccountexplicitly データバンドルに束の値を渡しても渡しています。
バンドルが でないことを確認し、アカウントを追加する前のにが含まれていることを確認しました。そしてほとんどの場合、これは事実ですが、しばらくの間に毎回私はこれらの値を照会するときにnullを取得します。
アカウントを削除して再追加したばかりのNULLの戻り値はより一般的です。
onAccountSupdateListener 実装の onAccountSupdated メソッド内に照会をしているので、アカウントを追加して行くのが良い、右?
お願いします
オーセンター活動
.
// 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);
他のスレッド
.AccountManager am = AccountManager.get(mContext);
final string value2 = am.getUserData(mAccount, k2);
if (TextUtils.isEmpty(value2)) {
Log.d("WTF", "value is empty");
}
解決
私はあなたの問題を引き起こす可能性があるハニカムプラスの1つのバグを知っています。登録される前にアカウントのgetUserDataをgetUserDataにしてもらえたら、後続のgetUserData呼び出しはすべてNULLを返します。
コードを見れば。AccountManagerには、SQLiteデータベースによってバックアップされているメモリ内キャッシュがあります。GetUserDataを呼び出しても、登録されていなくても、メモリ内キャッシュuserdataを入力します。登録されていない場合、それはそれをUserDataでないと解釈します。アカウントの登録データベースのみを入力し、インメモリストアを無効にしません。
これはあなたの問題を引き起こしているかもしれません。
回避策は、AddAccountExplelyを呼び出す前にアカウントを削除することです。
yaこの問題は、アカウントマネージャのIMOの巨大なバグであり、第三者があなたのアプリをESSENCE DOSにすることを可能にします。
他のヒント
Android 4を搭載したHTCデバイスを使用していますか?私は私の同期アプリのユーザーからこの問題の多くの報告を得ました。 ALL は、SDKレベル15のHTCデバイスを使用しました。
私にとってHTCのバグのように見えます。
再起動後に問題が発生したと報告された複数のユーザーが報告されました。
アップデート:その間私たちは適切な回避策を見つけました、 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.