我正在使用创建一个新的 Android 应用程序SyncAdapter
处理数据库同步。
我已准备就绪,应用程序工作正常,但我注意到我登录了两次。
首次登录发生在AuthenticatorActivity
类(它扩展了AccountAuthenticatorActivity
) 验证用户和密码。
如果用户名和密码正确AuthenticatorActivity
然后:
- If the
account
不存在它创建它使用mAccountManager.addAccountExplicitly()
- The
authToken
保存时使用intent.putExtra(AccountManager.KEY_AUTHTOKEN, authToken);
这基本上是从 Android 示例中复制/粘贴的,所以我想没问题。
问题是当SyncAdapter
发射和使用
authtoken = mAccountManager.blockingGetAuthToken(account,
AuthenticatorActivity.PARAM_AUTHTOKEN_TYPE, true);
The getAuthToken()
里面的方法Authenticator
扩展的类AbstractAccountAuthenticator
叫做。在这个方法中,我再次点击登录端点。
从那时起,登录端点不会再次被点击,直到authToken
过期。
这并不是什么让我很困扰的事情,但我想知道是否有办法避免登录两次。
但正如你所见Authenticator.java
在 SampleSyncAdapter 中说
这个类演示的有趣的事情是使用 authTokens 作为身份验证过程的一部分。 ...如果我们已经在帐户中存储了 authToken,我们将返回该 authToken。如果没有,但我们确实有用户名和密码,那么我们将尝试与示例服务通信以获取 authToken。
这是一个谎言。Authenticator.getAuthToken
不进行任何缓存检查,它只是访问网络以获取令牌。
解决方案是添加缺失的检查:
Authenticator.java:
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle loginOptions) throws NetworkErrorException {
// check that authToken type supported
...
// Check if we already have a cached token to return
final AccountManager am = AccountManager.get(mContext);
String cachedAuthToken = am.peekAuthToken(account, authTokenType);
if (cachedAuthToken != null) {
final Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, Constants.ACCOUNT_TYPE);
result.putString(AccountManager.KEY_AUTHTOKEN, cachedAuthToken);
return result;
}
// Get new authToken from server
...
// If all else fails, prompt the user for credentials
...
}
请注意,项目的其余部分需要认真使用AccountManager.invalidateAuthToken
当调用失败时,否则您将陷入无限循环的调用失败,尝试获取新的身份验证令牌,然后在返回相同的缓存身份验证令牌时再次失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)