简体   繁体   English

使用intent打开下载的文件

[英]Open downloaded file using intent

I make a retrofit call to my own API that provides me a list of files with the following content: 我对我自己的API进行了改装调用,它为我提供了一个包含以下内容的文件列表:

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

I show this list of files using a recycler view. 我使用Recycler视图显示这个文件列表。 When I click on one element from recycler view, I decode the base64 content and generate a file like the following: 当我从回收站视图中单击一个元素时,我解码base64内容并生成如下文件:

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

After this is complete, I would like to open this file using the Android file manager. 完成后,我想使用Android文件管理器打开此文件。

How can I force to open that stored file? 如何强制打开存储的文件?

If you meant opening by the default file opener for that file type you can use the method below. 如果您打算通过该文件类型的默认文件打开器打开,则可以使用以下方法。

[I found this solution on this site a long ago, I don't have the original link to that answer] [我很久以前在这个网站上找到了这个解决方案,我没有这个答案的原始链接]

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM