我正在开发一款使用 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");
}
答案 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()
,该线程通常可以正常运行,但显然不能保证能正常工作。