Определить, существует ли активность на текущем устройстве? - PullRequest
25 голосов
/ 21 мая 2010

Есть ли способ проверить и проверить, существует ли активность на вашем устройстве?Если у меня есть ссылка на видео на YouTube, я хочу указать ее открытой в YouTube PlayerActivity.Однако я не хочу падать, если по какой-то причине у них его нет.

Есть ли способ проверить и проверить, существует ли активность?Я не думаю, что смогу поймать исключение времени выполнения, так как startActivity () его не выдает.

Ответы [ 5 ]

76 голосов
/ 21 мая 2010

Вы можете создать объект Intent с необходимой информацией о компоненте, а затем проверить, вызывается ли намерение или нет. Я наткнулся на этот фрагмент здесь, на SO, не имею ссылки на реальный поток.

private boolean isCallable(Intent intent) {
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
            PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
}
19 голосов
/ 01 января 2014

Это самый простой способ сделать это:

boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null;

Это также рекомендуемый Google :

Чтобы сначала убедиться, что приложение существует для получения намерения, вызовите resolveActivity() вашего объекта Intent. Если результат не нулевой, есть хотя бы одно приложение, которое может обработать намерение, и безопасно вызвать startActivity(). Если результат равен нулю, вам не следует использовать намерение и, если возможно, следует отключить функцию, которая вызывает намерение.

7 голосов
/ 06 октября 2011

Я закончил тем, что сделал:

        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.

4 голосов
/ 21 мая 2010

Не думаю, что смогу поймать время выполнения исключение

На самом деле, это работает:

try {
    startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
    Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}
0 голосов
/ 09 февраля 2016

Вот как я могу проверить, доступно ли 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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...