14

AccountManagerを使用してアカウントと資格情報を保存する Android アプリに取り組んでいます。私が抱えている問題の 1 つは、AccountManager のaddAccountExplicitlyデータ バンドルに一連の文字列値を渡しているにもかかわらずです。

アカウントを追加する前に、バンドルがではなく、値が含まれていることを確認しました。ほとんどの場合はこれに当てはまりますが、これらの値をクエリすると、ときどき null が返されます。

アカウントを削除して再度追加した後は、null の戻り値がより一般的になります。

OnAccountsUpdateListener実装のonAccountsUpdatedメソッド内でクエリを実行しているので、アカウントを追加して準備完了です。

助けてくれてありがとう

AuthenticatorActivity

// 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");
}
4

4 に答える 4

9

Honeycomb plus に、問題を引き起こす可能性のあるバグが 1 つあります。アカウントが登録される前にそのアカウントの getUserData を取得しようとすると、以降のすべての getUserData 呼び出しで null が返されます。

コードを見ると。AccountManager には、sqlite データベースによってサポートされるメモリ内キャッシュがあります。getUserData を呼び出すと、登録されていない場合でも、メモリ内キャッシュのユーザーデータが読み込まれます。登録されていない場合は、ユーザーデータがないと解釈されます。アカウントを登録しても、データベースにデータが入力されるだけで、インメモリ ストアは無効になりません。

これが問題の原因となっている可能性があります。

回避策は、addAccountExplicitly を呼び出す前にアカウントを削除することです。

この問題は最悪で、AccountManger IMO の巨大なバグであり、サード パーティがアプリの本質的な DOS を実行できるようにします。

于 2012-07-28T03:59:44.843 に答える
3

Are you using an HTC device with Android 4? I got many reports of this issue from users of my sync apps. All of them used an HTC device with SDK level 15.

Looks like an HTC bug to me.

Several users reported that issue vanished after a reboot.

Update: Meanwhile we found a proper workaround, see https://stackoverflow.com/a/29776224/1558654

于 2012-07-27T23:42:11.643 に答える
0

同様の問題がありましたが、私の問題は、文字列ではなく長い userData 値を保存しようとしていることが判明しました。ストレージ用に long を文字列に変換し、それを引き出すときに再び long に解析すると、うまくいきました。

于 2015-01-03T17:20:57.760 に答える