Android. Как открыть файл в другом приложении с помощью Intent?

Я пытаюсь открыть файл с помощью другого приложения, т. е. открываю .jpg с помощью Gallery, .pdf с помощью Acrobat и т. д.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь открыть файл в приложении, он открывает только выбранное приложение, а не открывает файл в приложении. Я попытался выполнить Android открыть файл PDF через Intent, но я должен что-то упустить.

public String get_mime_type(String url) {
    String ext = MimeTypeMap.getFileExtensionFromUrl(url);
    String mime = null;
    if (ext != null) {
        mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
    }
    return mime;
}

public void open_file(String filename) {
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS), filename);

    // Get URI and MIME type of file
    Uri uri = Uri.fromFile(file).normalizeScheme();
    String mime = get_mime_type(uri.toString());

    // Open file with user selected app
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(uri);
    intent.setType(mime);
    context.startActivity(Intent.createChooser(intent, "Open file with"));
}

Насколько я могу судить, он возвращает правильный URI и тип MIME:

URI: file:///storage/emulated/0/Download/Katamari-ringtone-985279.mp3
MIME: audio/mpeg

person Martin Himmel    schedule 24.07.2015    source источник
comment
Просто крошечная заметка, вызывающая setType() после того, как setData() очистит данные, поэтому в идеале используйте setDataAndType()   -  person KaosXIV    schedule 03.06.2020


Ответы (2)


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

public void open_file(String filename) {
    File path = new File(getFilesDir(), "dl");
    File file = new File(path, filename);

    // Get URI and MIME type of file
    Uri uri = FileProvider.getUriForFile(this, App.PACKAGE_NAME + ".fileprovider", file);
    String mime = getContentResolver().getType(uri);

    // Open file with user selected app
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(uri, mime);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(intent);
}
person Martin Himmel    schedule 29.07.2015
comment
Я пытался использовать его в своем приложении, но он ведет себя странно. Я пытался Google, но нет ответа. Этот метод работает с некоторыми сторонними приложениями и не работает с некоторыми другими. Я загружаю файл и отправляю Intent, но некоторые сторонние приложения не могут его открыть. Если я использую браузер для загрузки того же файла и открываю файл из браузера (или файлового менеджера) с тем же сторонним приложением, то он работает хорошо. Я думаю, что есть хитрый секрет в том, как браузеры и файловые менеджеры отправляют намерение. У вас есть идея? - person bdevay; 29.12.2017
comment
спасибо сделал мой день чувак - person KhoaHA; 26.09.2019
comment
@devay у меня такая же проблема. Вы решили это? Если да, можете ли вы мне помочь? - person Roshan S; 13.06.2020

Я использовал этот фрагмент кода, и он отлично работал на Android 6 и ниже, не тестировался на более высокой версии.

public void openFile(final String fileName){
    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri uri = Uri.fromFile(new File(android.os.Environment.getExternalStorageDirectory()
            .getAbsolutePath()+ File.separator+"/Folder/"+fileName));
    intent.setDataAndType(uri, "audio/mpeg");
    startActivity(intent);
}
person Derrick    schedule 23.05.2019
comment
это открывает только тип файла аудио / mpeg, не все, нужно упоминать - person Durgesh Kumar; 25.04.2020