2010-05-20 3 views
22

Existe-t-il un moyen de vérifier et de vérifier si une activité existe sur votre appareil? Si j'ai un lien vidéo YouTube, je veux le spécifier dans YouTube PlayerActivity. Cependant, je ne veux pas planter si pour une raison quelconque ils ne l'ont pas.Déterminer si une activité existe sur le périphérique actuel?

Existe-t-il un moyen de vérifier et de voir si l'activité existe? Je ne pense pas que je puisse attraper l'exception d'exécution car startActivity() ne la lance pas.

Répondre

6

Je ne pense pas que je peux prendre le temps d'exécution exception

En fait, cela fonctionne:

try { 
    startActivity(new Intent(..)); 
} catch (ActivityNotFoundException e) { 
    Toast.makeText(this, "Not installed.", LENGTH_SHORT).show(); 
} 
+6

Cela fonctionne bien sûr, mais c'est généralement considéré comme une mauvaise pratique de le faire comme ça. La réponse par Samuh (http://stackoverflow.com/a/2879403/15695) est la bonne façon de le faire. – BoD

+0

Non seulement c'est une mauvaise pratique, mais si vous avez besoin d'utiliser startActivityForResult, il y a de sérieux problèmes d'efficacité/de gel sur les appareils sur lesquels j'ai testé. –

69

Vous pouvez créer un objet Intent avec les informations de composant nécessaires, puis vérifier si l'intention est appelable ou non. Je suis tombé sur cet extrait ici sur SO, je n'ai pas le lien vers le thread réel.

private boolean isCallable(Intent intent) { 
     List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
      PackageManager.MATCH_DEFAULT_ONLY); 
     return list.size() > 0; 
} 
+1

C'est le * correct * réponse :) – hrules6872

+0

Comment utilisez-vous? –

7

J'ai fini par faire:

 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)); 
     } 

Th garantit que l'intention d'ajout de compte propre à Google existe et, dans le cas contraire, retombe sur l'ACTION_ADD_ACCOUNTS plus général.

14

C'est la façon la plus simple de le faire:

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

Il est aussi celui recommended by Google:

Pour d'abord vérifier qu'une application existe pour recevoir l'intention, appelez resolveActivity() sur votre intention objet. Si le résultat est non-nul, il y a au moins une application qui peut gérer l'intention et il est sûr d'appeler startActivity(). Si le résultat est null, vous ne devez pas utiliser l'intention et, si possible, vous devez désactiver la fonctionnalité qui invoque l'intention.

+1

Renvoie true pour une activité qui n'existe pas. J'ai peur que ce ne soit pas la meilleure solution. J'ai utilisé la méthode isCallable affichée dans une autre réponse et cela fonctionne comme prévu. – tomrozb

+0

@toro Qu'est-ce que 'intent.resolveActivity (getPackageManager())' a renvoyé alors? Si cette méthode retourne vraiment une activité inexistante, cela ressemble vraiment à un bug. En outre, selon la documentation de Google, la liste list = getPackageManager(). QueryIntentActivities (intention, PackageManager.MATCH_DEFAULT_ONLY); 'fait exactement la même chose, sauf qu'elle ne renvoie pas seulement l'activité avec la priorité absolue. – Malcolm

+1

J'ai l'intention créée comme ceci: 'intent.setComponent (new ComponentName (" paquet "," package.nom-de-nom de module)); 'Que retourne-t-il vous demander -' ComponentInfo {"package"/"package.activity- nom} '. Mais en fait, l'activité n'existe pas, donc l'appel de cette intention se terminera dans un crash d'exécution. – tomrozb

0

Voilà comment je vérifie si un Activity est disponible sur le périphérique:

 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); 
     } 
Questions connexes