android - 使用 Intent 打开下载的文件

标签 android file android-intent kotlin

我对自己的 API 进行了改进调用,它为我提供了包含以下内容的文件列表:

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

我使用回收器 View 显示此文件列表。当我从回收器 View 中单击一个元素时,我会解码 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 文件管理器打开此文件。

如何强制打开该存储的文件?

最佳答案

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

[我很久以前就在这个网站上找到了这个解决方案,我没有该答案的原始链接]

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

}

关于android - 使用 Intent 打开下载的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56294878/

相关文章:

android - startActivityForResult 无法与 launchMode singleInstance 一起正常工作

android - 如何使用 Android Jetpack Compose 实现 BottomAppBar 和 BottomDrawer 模式?

c - 动态分配整数数组,将它们存储在文件中并在 c 中找到它们的平均值

android - 你能解释一下 IntentService 是如何工作的吗

android - 在抽屉导航中打开另一个 Activity 时应用程序崩溃

android - FLAG_ACTIVITY_SINGLE_TOP 不工作

java - 当变量的值变为零时停止递减为负值

java - Android studio dalvik vm 找不到类

windows - 如何检查网络共享EXE文件是否被多个用户使用?

c - 从文件读取动态结构