AccountManager getUserData尽管已设置,但返回null

问题描述 投票:14回答:4

我正在使用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");
}
android accountmanager android-account
4个回答
9
投票

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

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

这可能引起您的问题。

解决方法是先删除帐户,然后再调用addAccountExplicitly。

是的,此问题很糟,是AccountManger IMO中的一个巨大错误,允许第三方从本质上对您的应用程序进行DOS处理。


3
投票

您是否在Android 4上使用HTC设备?我的同步应用程序的用户收到了许多有关此问题的报告。他们中的全部使用了SDK级别为15的HTC设备。

在我看来像是HTC的错误。

几个用户报告说,重新启动后该问题消失了。

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.