Ответ 1
Я не думаю, что смогу поймать время исполнения Исключение
Собственно, это работает:
try {
startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}
Есть ли способ проверить и посмотреть, существует ли активность на вашем устройстве? Если у меня есть ссылка на YouTube, я хочу указать ее в YouTube PlayerActivity. Однако я не хочу разбиваться, если по какой-то причине у них его нет.
Есть ли способ проверить и посмотреть, существует ли активность? Я не думаю, что могу уловить исключение во время выполнения, поскольку startActivity() не бросает его.
Я не думаю, что смогу поймать время исполнения Исключение
Собственно, это работает:
try {
startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}
Вы можете создать объект Intent с необходимой информацией о компоненте, а затем проверить, является ли намерение вызываемым или нет. Я наткнулся на этот фрагмент здесь на SO, у вас нет ссылки на фактический поток.
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Это самый простой способ сделать это:
boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null;
Это также рекомендованный Google:
Чтобы убедиться, что приложение существует для получения намерения, вызовите
resolveActivity()
в свой объект Intent. Если результат не равен нулю, существует хотя бы одно приложение, которое может обрабатывать намерение и безопасно позвонитьstartActivity()
. Если результат равен нулю, вы не должны использовать намерение, и, если возможно, вы должны отключить функцию, которая вызывает намерение.
Я закончил работу:
Intent intent = new Intent();
intent.setClassName( "com.google.android.gsf", "com.google.android.gsf.login.AccountIntroActivity" );
if(getContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
getContext().startActivity( intent );
} else {
getContext().startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT));
}
Это гарантирует, что намерение добавления учетной записи для Google существует, а если нет, возвращается к общим более общим ACTION_ADD_ACCOUNTS.
Здесь, как я проверяю, есть ли Activity
на устройстве:
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tell//:" + phoneNumber));
PackageManager manager = context.getPackageManager();
List<ResolveInfo> activities = manager.queryIntentActivities(
intent, 0);
if (!manager.hasSystemFeature(
PackageManager.FEATURE_TELEPHONY) || activities == null || activities
.size() < 1) {
Toast.makeText(
context,
"Sorry, there were no apps that worked with that request.",
Toast.LENGTH_SHORT).show();
} else {
context.startActivity(intent);
}