Как проверить, может ли какое-либо намерение быть обработано из какой-либо деятельности?

У меня есть этот метод до сих пор, но он появился, как будто чего-то не хватает

Например, у меня есть файл /sdcard/sound.3ga, который возвращает false (например, нет активности, которая может обрабатывать этот тип файла), но когда я открываю его из файлового менеджера, он открывается с медиаплеером без проблем

Я думаю, что это намерение не является полным, и мне нужно что-то еще, чтобы убедиться, что переменная handlerExists будет ложной ТОЛЬКО, если нет активности, которая могла бы справиться с этим намерением

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; 

Solutions Collecting From Web of "Как проверить, может ли какое-либо намерение быть обработано из какой-либо деятельности?"

 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 } 

Вы пробовали это?

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

Решение edwardxu отлично работает для меня.

Чтобы немного уточнить:

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

Вы можете использовать:

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