Android での AbstractAccountAuthenticator の実装に問題があります。最初に、それがどのように機能するかを正しく理解しているかどうか教えてください。アプリのどこかで特定のアカウントと AuthTokenType の getAuthToken メソッドを呼び出すと、Android はシステム キーチェーンでそのトークンを見つけようとします。存在する場合は、単純にコールバックを呼び出し、提供されたバンドルにトークンを入れます。そのようなトークンがない場合 (その場合のみ)、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 には、OAuth ログイン フォームを読み込む WebView があり、ユーザーが資格情報を入力してアプリを承認できるようにします。トークンを取得した後、このコードを呼び出します
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 が発生しました。トークンがありません..
そこに戻ってトークンを提供する方法を教えてください。または、これをより適切に実装する方法を教えてください。