使用意图打开下载的文件

时间:2019-05-24 14:40:44

标签: android file android-intent kotlin

我对自己的API进行了改造,该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 :(得分:0)

如果要使用默认文件打开器打开该文件类型,可以使用以下方法。

[我很久以前在此站点上找到了该解决方案,我没有指向该答案的原始链接]

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();
    }

}