Носитель не найден на Android 11 при попытке открыть файл с помощью ACTION_VIEW

#java #android #android-11

#java #Android #android-11

Вопрос:

У меня есть метод, который я использую для открытия файла из своего приложения, и все работает нормально до Android 10, но когда я пытаюсь открыть файл в Android 11 с помощью Google Photos, он не открывает его и показывает, что носитель не найден. тост. Я пытаюсь открыть в любом внешнем приложении.

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

 private void openFile(String url) throws IOException {
    // Create URI
    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());
    Uri uri = Uri.parse(url);

    Intent intent = null;
    // Check what kind of file you are trying to open, by comparing the url with extensions.
    // When the if condition is matched, plugin sets the correct intent (mime) type,
    // so Android knew what application to use to open the file
    intent = new Intent(Intent.ACTION_VIEW);
    if (url.contains(".doc") || url.contains(".docx")) {
        // Word document
        intent.setDataAndType(uri, "application/msword");
    } else if(url.contains(".pdf")) {
        // PDF file
        intent.setDataAndType(uri, "application/pdf");
    } else if(url.contains(".ppt") || url.contains(".pptx")) {
        // Powerpoint file
        intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
    } else if(url.contains(".xls") || url.contains(".xlsx")) {
        // Excel file
        intent.setDataAndType(uri, "application/vnd.ms-excel");
    } else if(url.contains(".rtf")) {
        // RTF file
        intent.setDataAndType(uri, "application/rtf");
    } else if(url.contains(".wav")) {
        // WAV audio file
        intent.setDataAndType(uri, "audio/x-wav");
    } else if(url.contains(".gif")) {
        // GIF file
        intent.setDataAndType(uri, "image/gif");
    } else if(url.contains(".jpg") || url.contains(".jpeg")) {
        // JPG file
        intent.setDataAndType(uri, "image/jpeg");
    } else if(url.contains(".png")) {
        // PNG file
        intent.setDataAndType(uri, "image/png");
    } else if(url.contains(".txt")) {
        // Text file
        intent.setDataAndType(uri, "text/plain");
    } else if(url.contains(".mpg") || url.contains(".mpeg") || url.contains(".mpe") || url.contains(".mp4") || url.contains(".avi")) {
        // Video files
        intent.setDataAndType(uri, "video/*");
    }

    //if you want you can also define the intent type for any other file

    //additionally use else clause below, to manage other unknown extensions
    //in this case, Android will show all applications installed on the device
    //so you can choose which application to use


    else {
        intent.setDataAndType(uri, "*/*");
    }

    this.cordova.getActivity().startActivity(intent);
}
  

Комментарии:

1. Какое значение url ?

2. Пожалуйста, избавьтесь от этого strictmode.

3. «file:///storage/emulated/0/Android/data/com.tracer.joblogic/files/401-1604468628817.jpeg » это URL-адрес

4. Такой URL-адрес нельзя использовать для ACTION_VIEW начиная с Android 7 / N. Или, может быть, дольше, потому что вы использовали strictmode. Теперь действительно пора удалить этот материал в строгом режиме и написать приличный код.

5. Действительно. Исключение FileUriExposedException. Решите это! Немного погуглив, вы найдете решение.