1

我在 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,令牌不存在..

请你帮我如何提供令牌,或者告诉我如何更好地实现这个?

4

0 回答 0