В Android, как я могу отображать селектор приложений на основе типа файла?

Извиняюсь, если об этом уже ответили – если кто-то может указать мне на уже ответный вопрос, это было бы здорово …

Очень просто, я хотел бы иметь возможность всплывать список приложений, которые могут обрабатывать файл определенного типа – например, если у меня есть музыкальный файл (mp3, ogg, что угодно), я хотел бы быть в состоянии Для отображения списка всех загруженных мультимедийных приложений, которые могут обрабатывать файл, и позволяют пользователю выбирать его.

Я играл с созданием намерения сделать это следующим образом:

Intent myIntent = new Intent(); myIntent.setAction(Intent.ACTION_VIEW); myIntent.addCategory("android.intent.category.LAUNCHER"); myIntent.setType("mp3"); startActivity(myIntent); 

Но я, очевидно, ошибся, так как он каждый раз падает. Должен ли я использовать ACTION_PICK или ACTION_CHOOSER вместо ACTION_VIEW?

Что еще более важно, можно ли легко определить всех медиаплееров чем-то иным, чем Intent.type? Я считаю, что тип должен быть правильным типом MIME, в нижнем регистре, но я не уверен, что использовать в этом случае …

Пожалуйста, будьте нежны 🙂

Чтобы получить приложения, которые могут успешно открыть заданное намерение, вы будете использовать PackageManager. Просто создайте намерение, как указано выше, а затем используйте этот код, чтобы получить приложения, которые могут обрабатывать намерение.

 Intent myIntent = new Intent(); myIntent.setAction(Intent.ACTION_VIEW); myIntent.addCategory("android.intent.category.LAUNCHER"); myIntent.setType("mp3"); PackageManager manager = getPackageManager(); List<ResolveInfo> info = manager.queryIntentActivities( myIntent, PackageManager.MATCH_DEFAULT_ONLY); 

Это даст вам всю информацию о программах, которые могут обрабатывать намерение, включая значок и имя пакета. Затем вы можете создать диалоговое окно с этими параметрами и сохранить выбранный пользователем вариант.

Я предполагаю, что вы хотите увидеть это диалоговое окно выбора, если вы открываете файл (или URL), и есть несколько приложений, зарегистрированных для его обработки? Например, вы открываете URL-адрес YouTube и можете использовать проигрыватель YouTube или браузер?

Это тот тип намерений, который посылает система, когда я хочу открыть изображение (через браузер файлов):

 File f = new File("/sdcard/IMG_0114.JPG"); Uri uri = Uri.fromFile(f); Intent i = new Intent(Intent.ACTION_VIEW); // use setDataAndType() - setData() and setType() cancel each other i.setDataAndType(uri, "image/jpeg"); i.putExtra("preview", false); i.putExtra("key_filename", "/sdcard/IMG_0114.JPG"); i.putExtra(Intent.EXTRA_STREAM, uri); i.putExtra("sort_order", 0); // It's one of the flag combinations: i.setFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_DEBUG_LOG_RESOLUTION); startActivity(i); 

EDIT: скорректированный код для получения рабочего (минимального) решения.

Я не уверен, какие поля дополнительных данных должны быть установлены – для этого не найдено документации.