AccountManager getUserData尽管设置了,但仍返回null

时间:2012-05-18 18:08:36

标签: android accountmanager android-account

我正在开发一款使用 AccountManager 存储帐户的Android应用。证书。我遇到的一个问题是,即使我将一堆String值传递给AccountManager的 addAccountExplicitly 数据包。

我已检查确保捆绑包非空,并且在添加帐户之前包含值。大部分时间都是这种情况,但每当我查询这些值时,我偶尔会得到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 个答案:

答案 0 :(得分:9)

我知道Honeycomb plus中的一个错误可能会导致您的问题。如果在注册之前尝试获取帐户的getUserData,则所有后续的getUserData调用都将返回null。

如果你看一下代码。 AccountManager具有由sqlite数据库支持的内存缓存。调用getUserData会填充内存缓存userdata,即使它未注册也是如此。如果未注册,则将其解释为无用户数据。注册帐户只会填充数据库,并且不会使内存存储无效。

这可能会导致您的问题。

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

雅这个问题很糟糕,在AccountManger IMO中是一个巨大的错误,并允许第三方使用本质DOS你的应用程序。

答案 1 :(得分:3)

您使用的是安卓4的HTC设备吗?我的同步应用用户收到了很多关于此问题的报告。 所有都使用了SDK等级为15的HTC设备。

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

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

更新:同时我们找到了正确的解决方法,请参阅https://stackoverflow.com/a/29776224/1558654

答案 2 :(得分:0)

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

答案 3 :(得分:0)

一个可能的原因是在后台线程上调用AccountManager.getUserData()documentation说:“从主线程调用此方法很安全。”我们的应用在后台线程上调用AccountManager.getUserData(),该线程通常可以正常运行,但显然不能保证能正常工作。