Authenticating to OAuth2 Servicesに従い、AccountManagerFuture#getResult()呼び出しによって提供されるバンドルにインテントが含まれている部分を実装しようとしています。
問題は、ドキュメントでActivity#startActivityForResult(...)を使用するように指示されていても、起動するように指示されたインテントは明らかに独自のタスクで開始され、onActivityResultがすぐに呼び出されることです。
私が正しく行っているかどうかわからないもう1つの部分は、このインテントを起動する方法です。AccountManager#getAuthToken(...)を呼び出すコードは、現在のアクティビティにアクセスできないワーカースレッド内に埋め込まれているため、「CredentialsActivity」と呼ばれる新しいアクティビティを起動し、startActivityForResultを使用してOS提供のインテントを起動します。
これは私がそれを行う方法です:
final AccountManagerFuture<Bundle> future = AccountManager.getAuthToken(...);
// Now that we have the Future, we extract the Bundle
Bundle bundle = null;
try {
bundle = future.getResult();
} catch (Exception e) {
log.warn(e, "Got an Exception");
}
if (bundle == null) {
log.info("Unable to get auth token");
return;
}
// Check if the user needs to enter credentials.
final Intent askForPassword = (Intent) bundle.get(AccountManager.KEY_INTENT);
if (askForPassword != null) {
log.dev("Need to prompt for credentials, firing Intent...");
CredentialsActivity.promptForCredentials(context, askForPassword);
}
これらは、CredentialsActivityの関連部分です。
private static final int REQUEST_CODE_LAUNCH_CREDENTIALS_INTENT = 0;
private static Intent newCredentialsActivityIntent(Context context) {
final Intent intent = new Intent(context, CredentialsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return intent;
}
public static void promptForCredentials(Context context, Intent credentialsIntent) {
final Intent intent = newCredentialsActivityIntent(context);
intent.putExtra(Intent.EXTRA_INTENT, credentialsIntent);
context.startActivity(intent);
}
onResumeでインテントを起動します。
@Override
protected void onResume() {
super.onResume();
final Intent intent = getIntent();
final Intent credentialsIntent = (Intent) intent.getParcelableExtra(Intent.EXTRA_INTENT);
if (credentialsIntent != null) {
startActivityForResult(credentialsIntent, REQUEST_CODE_LAUNCH_CREDENTIALS_INTENT);
}
}