Подтвердить что ты не робот

Запуск намерения для файла и 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 без успеха.

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

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

4b9b3361

Ответ 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) {
    ...
}     

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