Я пытаюсь следовать Аутентификация в службах OAuth2 и реализовать часть, в которой Intent включен в Bundle, предоставляемый вызовом AccountManagerFuture#getResult().
Проблема в том, что, несмотря на то, что в документах говорится об использовании Activity#startActivityForResult(...), Intent, который мне сказали запустить, по-видимому, запускается в своей собственной задаче, в результате чего onActivityResult вызывается немедленно.
Еще одна часть, которую я не уверен, что делаю правильно, — это то, как я запускаю это намерение. Поскольку код, который вызывает AccountManager#getAuthToken(...), скрыт внутри рабочего потока без доступа к текущему действию, я запускаю новое действие, которое я называю «CredentialsActivity», которое затем запускает намерение, предоставленное ОС, с помощью startActivityForResult.
Вот как я это делаю:
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);
}
Я запускаю 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);
}
}