14

我正在开发一个使用AccountManager存储帐户和凭据的 Android 应用程序。我遇到的一个问题是,即使我将一堆字符串值传递给 AccountManager 的addAccountExplicitly数据包。

我已检查以确保捆绑包不为空并且它包含添加帐户之前的值。大多数时候都是这种情况,但是当我查询这些值时,每隔一段时间我就会得到空值。

在我刚刚删除帐户并重新添加它之后,空返回值更常见。

我在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 中的一个错误可能会导致您的问题。如果您在注册之前尝试获取帐户的 getUserData,则所有后续 getUserData 调用都将返回 null。

如果你看代码。AccountManager 有一个由 sqlite 数据库支持的内存缓存。调用 getUserData 会填充内存缓存用户数据,即使它没有注册。如果未注册,则将其解释为没有用户数据。注册帐户只会填充数据库,不会使内存中的存储失效。

这可能会导致您的问题。

解决方法是在调用 addAccountExplicitly 之前删除该帐户。

是的,这个问题很糟糕,并且是 AccountManger IMO 中的一个巨大错误,并允许第三方对您的应用程序进行本质 DOS。

于 2012-07-28T03:59:44.843 回答
3

您使用的是装有 Android 4 的 HTC 设备吗?我从我的同步应用程序的用户那里收到了许多关于此问题的报告。他们都使用了 SDK 级别 15 的 HTC 设备。

对我来说看起来像一个 HTC 错误。

一些用户报告说,重启后问题消失了。

更新:同时我们找到了一个合适的解决方法,见https://stackoverflow.com/a/29776224/1558654

于 2012-07-27T23:42:11.643 回答
0

我有一个类似的问题,但我的问题是试图存储一个长的 userData 值而不是一个字符串。将我的 long 转换为用于存储的字符串,并在将其拉出时再次将其解析为 long,这对我来说是诀窍。

于 2015-01-03T17:20:57.760 回答
0

造成这种情况的一个潜在原因可能是调用AccountManager.getUserData()后台线程。文档说“从主线程调用这个方法是安全的” 。我们的应用程序正在调用AccountManager.getUserData()后台线程,这通常可以正常工作,但显然不能保证正常工作。

于 2019-12-15T00:18:56.730 回答