AccountManager GetUserData返回NULL,尽管它被设置
-
11-12-2019 - |
题
我正在使用使用 accommanager 来存储帐户和凭据的Android应用程序。我一直在遇到一个问题是,即使我将一堆字符串值传递给AccountManager的 AddAccountExplictly 数据包。
我已检查以确保捆绑包不为空,它包含在添加帐户之前的值。而且大部分时间都是如此,但是当我查询这些值时,每次偶尔都会获得空。
在删除帐户并重新添加它后,空返回值更常见。
我正在在 onaccountsupddated 方法中在 onaccountsupdatelisteNistener 实现的情况下进行查询,因此应添加帐户并更好地进行,右?
感谢任何帮助
身份验证者
.
// 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");
}
解决方案
我知道Honeycomb Plus中的一个错误,可能导致您的问题。如果您尝试在注册之前的帐户的GetUserData,则所有后续GetUserData调用将返回NULL。
如果您查看代码。AccountManager具有由SQLite数据库备份的内存中缓存。调用getUserdata填充内存缓存userData,即使没有注册。如果未注册,则它将解释为没有UserData。注册帐户只填充数据库,不会使存储器存储无效。
这可能会导致您的问题。
解决方法是在调用addAccountexplically之前删除帐户。
ya这个问题很糟糕,是accountmanger imo的一个巨大的错误,允许第三方对您的应用程序进行精华。
其他提示
您是使用带Android 4的HTC设备吗?我有许多来自我的同步应用程序的用户的报告。它们的所有它们使用了具有SDK级别15的HTC设备。
对我看起来像一个htc bug。
几个用户报告了重启后的问题消失了。
更新:同时我们找到了一个适当的解决方法,请参阅 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.