我在 Android 中实现 AbstractAccountAuthenticator 时遇到问题。首先,如果我做对了,请告诉我它应该如何工作。当我在我的应用程序的某个地方调用特定帐户和 AuthTokenType 的 getAuthToken 方法时,Android 会尝试在系统钥匙串中找到该令牌。如果它在那里,它只需调用回调 a 将令牌放入提供的 Bundle 中。如果没有这样的令牌(并且仅在这种情况下),它会实例化我自己的 AbstractAccountAuthenticator 实现并从那里调用 getAuthToken 方法?
这就是我得到那个的方式..
下面是我在 Authenticator 中的 getAuthToken 方法的实现
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle loginOptions) throws NetworkErrorException {
Log.v(TAG, "getAuthToken()");
if (!authTokenType.equals(AuthenticatorConfig.AUTH_TOKEN_TYPE)) {
final Bundle result = new Bundle();
result.putString(AccountManager.KEY_ERROR_MESSAGE, "invalid authTokenType");
return result;
}
final Intent intent = new Intent(mContext, LoginActivity.class);
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
final Bundle bundle = new Bundle();
bundle.putParcelable(AccountManager.KEY_INTENT, intent);
return bundle;
}
在 LoginActivity 我有一个 WebView,我在其中加载 OAuth 登录表单,让用户填写他们的凭据并授权应用程序。获得令牌后,我随后调用此代码
KosAccount.getInstance(getApplicationContext()).addAccount(getUserDataResponse);
Intent returnIntent = new Intent();
final Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, AuthenticatorConfig.ACCOUNT_TYPE);
result.putString(AccountManager.KEY_AUTHTOKEN, authToken);
//Here I need to put the result into the intent as an extra?
setResult(RESULT_OK, returnIntent);
finish();
如您所见,我正在向帐户添加新帐户(只有在没有这样的帐户时才需要重构并完成,否则我只需要更新当前帐户)
最后是我的主要问题..我不知道如何将结果包传递回AccountManager....我应该把它作为resultIntent的额外内容?整个事情似乎没有很好的记录,我花了很多时间才到这里:)
目前,当我尝试从我的 AuccountManagerCallback 中提供的 AccountManagerFuture 获取令牌时,我得到了 NullpointerException,令牌不存在..
请你帮我如何提供令牌,或者告诉我如何更好地实现这个?