130 votes

Comment vérifier si une intention peut être traitée à partir d'une activité ?

J'ai utilisé cette méthode jusqu'à présent, mais il semble qu'il manque quelque chose.

Par exemple, j'ai un fichier /sdcard/sound.3ga qui renvoie un message faux (comme si aucune activité ne pouvait gérer ce type de fichier), mais lorsque je l'ouvre à partir du gestionnaire de fichiers, il s'ouvre avec le lecteur multimédia sans problème.

Je pense que cette intention n'est pas complète et que je dois ajouter quelque chose pour m'assurer que la variable handlerExists sera fausse UNIQUEMENT s'il n'y a pas d'activité qui peut gérer cette intention.

PackageManager pm = getPackageManager();
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uriString)).toString());
String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
intent.setDataAndType(Uri.fromFile(new File(uriString)),mimetype);
boolean handlerExists = intent.resolveActivity(pm) != null;

165voto

Sparky1 Points 352

La solution d'edwardxu fonctionne parfaitement pour moi.

Juste pour clarifier un peu :

PackageManager packageManager = getActivity().getPackageManager();
if (intent.resolveActivity(packageManager) != null) {
    startActivity(intent);
} else {
    Log.d(TAG, "No Intent available to handle action");
}

87voto

MoshErsan Points 5119
PackageManager manager = context.getPackageManager();
List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0);
if (infos.size() > 0) {
    //Then there is an Application(s) can handle your intent
} else {
    //No Application can handle your intent
}

Avez-vous essayé cette intention ?

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(yourFileHere));

56voto

xuxu Points 5676
if (intent.resolveActivity(getPackageManager()) == null) {
    // No Activity found that can handle this intent. 
}
else{
    // There is an activity which can handle this intent. 
}

4voto

Bassam Salama Points 41

La réponse claire pour résoudre ce problème

if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

2voto

Pedro Lobito Points 6794

Vous pouvez utiliser :

public static boolean isAvailable(Context ctx, Intent intent) {
   final PackageManager mgr = ctx.getPackageManager();
   List<ResolveInfo> list =
      mgr.queryIntentActivities(intent, 
         PackageManager.MATCH_DEFAULT_ONLY);
   return list.size() > 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X