6

こんにちは、呼び出し時に authToken の回復に問題があります

mAccountManager.blockingGetAuthToken(Auth.getAccount(), Auth.AUTH_TOKEN_TYPE, true)

null 文字列が返されたので、AbstractAccountAuthenticator クラス、具体的には getAuth() を調べました。これが何をしているのかです:

public Bundle getAuthToken(AccountAuthenticatorResponse response,
        Account account, String authTokenType, Bundle options)
        throws NetworkErrorException {

    final AccountManager am = AccountManager.get(mContext);

    String authToken = am.peekAuthToken(account, authTokenType);
    String uid = am.getUserData(account, AccountManager.KEY_CALLER_UID);


    // return bundle with authToken
    if (!TextUtils.isEmpty(authToken)) {
        final Bundle result = new Bundle();
        result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
        result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
        result.putString(AccountManager.KEY_AUTHTOKEN, authToken);
        result.putString(AccountManager.KEY_CALLER_UID, uid);
        return result;
    }


    return null;
}

peekAuthToken は null を返していますが、uidgetUserData から正しい値を取得しているため、アカウントを正しく追加していると思います。これは、authToken を設定する方法です。

mAccountManager.addAccountExplicitly(account, accountPassword, extraData);
//The addAccount is working, and I can obtain the extraData in getAuth
mAccountManager.setAuthToken(account, Auth.AUTH_TOKEN_TYPE, authtoken);
//I assume this is where the authToken is to be cached…but I can't retrieve it…
//The token does exist at this point

助言がありますか?

4

3 に答える 3

4

ドキュメントで読めるように、peekメソッドは authtoken-cache からのみ authToken を取得します。これが null を返している場合は、authtoken が無効になっていることを意味します。そうでない場合、メソッドAccountManager#getAuthTokenはキャッシュされたものを返すためです。

これは少しややこしいですが、説明しようと思います。

AccountManager からのgetAuthTokenは、オーセンティケーターのgetAuthToken-Methodと同じではないことに注意してください。AccountManager はその間にキャッシングを行っています。Manager で getAuthToken を呼び出すと、AuthToken がキャッシュにある限り、Authenticator の getAuthToken メソッドを呼び出さずに AuthToken が返されます。

私の理解では、 getAuthToken メソッド内で peek を呼び出すことはまったく無意味です。

これをどのように処理するか:

getAuthToken (オーセンティケーター内) の実装では、サーバーから authtoken を再要求し、アカウントを新しいトークンで更新します。これにより、それらがキャッシュに保存されます。その部分をのぞく必要はありません。

于 2015-06-17T09:26:36.550 に答える
2

必ず追加してください

setAccountAuthenticatorResult(authIntent.getExtras());
setResult(RESULT_OK,authIntent);

コードから authToken を設定したら。

于 2015-09-14T06:45:31.830 に答える