Проблема с захватом результата действия при срабатывании Intent, полученного от AccountManagerFuture.

Я пытаюсь следовать Аутентификация в службах 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);
    }
  }

person Warlax    schedule 21.11.2012    source источник


Ответы (1)


Итак, я думаю, что понял это - я опубликую ответ на всякий случай:

Проблема в том, что система предоставляет Intent с установленным флагом NEW_TASK. Мне нужно было очистить его, чтобы сделать эту работу для меня:

final Intent credentialsIntent = (Intent) intent.getParcelableExtra(Intent.EXTRA_INTENT);
if (credentialsIntent != null) {
  credentialsIntent.setFlags(0);
  startActivityForResult(credentialsIntent, REQUEST_CODE_LAUNCH_CREDENTIALS_INTENT);
}
person Warlax    schedule 26.11.2012