Подтвердить что ты не робот

Intent.resolveActivity!= null, но запуск намерения вызывает исключение ActivityNotFound

Я размещаю этот вопрос здесь для образовательных целей, так как я не мог найти ответы нигде и в конце концов нашел корень причиной старого пути, то есть сам.

Вот проблемный код:

// initially getting the intent from polling the PackageManager about activities resolving Search intent.

ComponentName componentName = intent.resolveActivity(pm);

if (componentName != null) {
    context.startActivity(intent);
}

несмотря на проверку, я получаю исключение ActivityNotFound.

РЕДАКТ: по-видимому, для всех это не было очевидным: как получилось действие, разрешающее намерение, но попытка его запуска выдает исключение ActivityNotFound - два факта, по-видимому, противоречивые?

4b9b3361

Ответ 1

Из того, что я мог видеть, намерение .resolveActivity() вернет true, если есть ЛЮБАЯ деятельность, разрешающая это намерение. Даже если эта деятельность не экспортируется (что делает ее непригодной для всех практических целей, если она не из вашего пакета). API Android не имеет к этому упоминания, поэтому вам нужно разобраться в этом сами и убедитесь, что активность, которую вы пытаетесь запустить, действительно экспортируется.

ActivityInfo activityInfo = intent.resolveActivityInfo(pm, intent.getFlags());
if (activityInfo.exported) {
    doSomething();
}

EDIT: точка этого вопроса заключается в том, что ResolveActivity вернет имя компонента, даже если activityInfo.exported == false И это не из вашего собственного пакета, что делает его неуправляемым, и удивил меня тем, что намерение было разрешено и все же неуязвимо.

Ответ 2

ActivityNotFound исключение возникает, когда вызов startActivity(Intent) или один из его вариантов терпит неудачу, потому что не удается найти Activity для выполнения заданного Intent. Например, если вы пытаетесь отправить электронное письмо, но на вашем устройстве нет приложения, которое могло бы обработать действие ACTION_SEND, ActivityNotFound будет выбрано.

Способ избежать исключения состоит в том, чтобы сделать следующее:

final ComponentName componentName = intent.resolveActivity(pm);
if (componentName != null) {
  try {
    context.startActivity(intent);    
  } catch (ActivityNotFoundException ex) {
    // Notify the user?
  }
}