我在Android中实现AbstractAccountAuthenticator时出现问题。 首先请告诉我,如果我做对了它应该如何工作.. 当我在我的应用程序的某处调用特定Account和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,但令牌不在那里..
你能帮我解决一下如何在那里提供令牌,或者告诉我如何更好地实现这一点吗?