Откройте загруженный файл, используя намерение - PullRequest
0 голосов
/ 24 мая 2019

Я произвожу модернизацию своего собственного API, который предоставляет мне список файлов со следующим содержимым:

[
  {
    "name": "Example_file.jpg",
    "ext": "jpg",
    "b64": "data in base 64 format"
  }
]

Я показываю этот список файлов, используя представление переработчика. Когда я щелкаю по одному элементу из представления переработчика, я декодирую содержимое base64 и генерирую файл, подобный следующему:

val content = Base64.getDecoder().decode(file.getB64()!!.toByteArray())
val os = FileOutputStream(getExternalStorageDirectory().path + file.getName(), true)
os.write(content)
os.flush()
os.close()

После этого я хотел бы открыть этот файл с помощью файлового менеджера Android.

Как я могу заставить открыть этот сохраненный файл?

1 Ответ

0 голосов
/ 24 мая 2019

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

[Я нашел это решение на этом сайте давно, у меня нет оригинальной ссылки на этот ответ]

public void openFile(File file, Context context) {

    Uri url = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file);

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
        // Word document
        intent.setDataAndType(url, "application/msword");
    } else if (url.toString().contains(".pdf")) {
        // PDF file
        intent.setDataAndType(url, "application/pdf");
    } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
        // Powerpoint file
        intent.setDataAndType(url, "application/vnd.ms-powerpoint");
    } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
        // Excel file
        intent.setDataAndType(url, "application/vnd.ms-excel");
    } else if (url.toString().contains(".zip") || url.toString().contains(".rar")) {
        // WAV audio file
        intent.setDataAndType(url, "application/x-wav");
    } else if (url.toString().contains(".rtf")) {
        // RTF file
        intent.setDataAndType(url, "application/rtf");
    } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) {
        // WAV audio file
        intent.setDataAndType(url, "audio/x-wav");
    } else if (url.toString().contains(".gif")) {
        // GIF file
        intent.setDataAndType(url, "image/gif");
    } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
        // JPG file
        intent.setDataAndType(url, "image/jpeg");
    } else if (url.toString().contains(".txt")) {
        // Text file
        intent.setDataAndType(url, "text/plain");
    } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) {
        // Video files
        intent.setDataAndType(url, "video/*");
    } else {
        //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
        intent.setDataAndType(url, "*/*");
    }

    try {
        if (file.exists())
            context.startActivity(Intent.createChooser(intent, "Open"));
        else
            Toast.makeText(context, "File is corrupted", Toast.LENGTH_LONG).show();

    } catch (Exception ex) {
        Toast.makeText(context, "No Application is found to open this file.\nThe File is saved at" + Constant.DIRECTORY, Toast.LENGTH_LONG).show();
    }

}
...