Запуск намерения для файла и 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, он открывается вместо этой ошибки, а затем, если я нажму тот же самый файл изнутри, он запустит соответствующие диалоги.
Я заметил, что тип MIME для этого конкретного файла выходит из строя, но другие типы mime, такие как .zip
, возвращают значения.
Мне не хватает чего-то, когда тип MIME имеет значение null, чтобы вызвать диалог, который позволяет пользователю выбрать?
Я пробовал другие варианты запуска приложения, в том числе не устанавливать тип MIME и использовать .setData
без успеха.
Действие, которое я хочу выполнить, - это щелчок пользователя по файлу, если он связан с приложением, запускаемым приложением, если нет, то пользователь получает диалоговое окно "Полное действие с помощью" со списком приложений.
Спасибо за любой совет.
Ответы
Ответ 1
Хорошо благодаря парням с 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
), он запускает соответствующий диалог выбора приложения.
Ответ 2
Вы можете использовать общие намерения для открытия файлов, например, этот код фрагмента, который предлагается здесь:
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) {
...
}
Вы можете увидеть полный код в этом вопросе или в этом проект с открытым исходным кодом. Надеюсь, это поможет вам.