Запуск намерения для файла и MIME-типа?

Я рассмотрел все подобные вопросы здесь, но я не могу за всю жизнь понять, что я делаю неправильно.

Я написал приложение, которое пытается запустить различные файлы, вроде файлового браузера. Когда щелкнут файл, он пытается запустить программу на основе связанного с ней типа MIME или представляет диалоговое окно «Выбрать приложение для запуска».

Вот код, который я использую для запуска:

File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position)); Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); myIntent.setDataAndType(Uri.fromFile(file),mimetype); startActivity(myIntent); 

Это не работает и генерирует ошибку:

 android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes } 

Теперь, если я устанавливаю OI File Manager, например, он открывается вместо этой ошибки, а затем, если я нажму тот же самый файл изнутри, он запустит диалоговые окна approriate.

Я заметил, что тип MIME для этого конкретного файла выходит из строя, но другие типы mime, такие как .zip , возвращают значения.

Я что-то пропустил, когда тип MIME имеет значение null, чтобы вызвать диалоговое окно, которое позволяет пользователю выбрать?

Я пробовал другие варианты запуска приложения, в том числе не устанавливать тип MIME и использовать только .setData без успеха.

Действие, которое я хочу выполнить, – это щелчок пользователя по файлу, если он связан с приложением, которое запускает приложение, если нет, пользователь получает диалоговое окно «Полное действие с помощью» со списком приложений.

Спасибо за любой совет.

Solutions Collecting From Web of "Запуск намерения для файла и MIME-типа?"

Хорошо благодаря парням Open Intent, я пропустил ответ в первый раз через свой код в своем файловом менеджере, вот что я в итоге:

  File file = new File(filePath); MimeTypeMap map = MimeTypeMap.getSingleton(); String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); String type = map.getMimeTypeFromExtension(ext); if (type == null) type = "*/*"; Intent intent = new Intent(Intent.ACTION_VIEW); Uri data = Uri.fromFile(file); intent.setDataAndType(data, type); startActivity(intent); 

Если вы используете тип mime "* / *" когда вы не можете определить его из системы (он равен null ), он запускает соответствующий диалог выбора приложения.

Вы можете использовать общие намерения для открытия файлов, например, этот код фрагмента, который предлагается здесь :

 private void openFile(File aFile){ try { Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION, new ContentURI("file://" + aFile.getAbsolutePath())); startActivity(myIntent); } catch (URISyntaxException e) { e.printStackTrace(); } } 

Но я обычно вижу, что приложения проверяют расширение файла в вложенном, если и, наконец, пытаются открыть файл с типом « text / plain »:

 Intent generic = new Intent(); generic.setAction(android.content.Intent.ACTION_VIEW); generic.setDataAndType(Uri.fromFile(file), "text/plain"); try { startActivity(generic); } catch(ActivityNotFoundException e) { ... } 

Вы можете увидеть полный код в этом вопросе или в этом проекте с открытым исходным кодом . Надеюсь, это поможет вам.