【问题标题】:Open downloaded file using intent使用意图打开下载的文件
【发布时间】:2019-05-24 14:40:44
【问题描述】:

我对自己的 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()

完成后,我想用安卓文件管理器打开这个文件。

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

【问题讨论】:

  • “我对自己的 API 进行了改造调用,它为我提供了包含以下内容的文件列表”——我强烈建议您修改您的 Web 服务,所以您可以单独和直接下载文件。这将消耗更少的带宽,并使您的应用程序因OutOfMemoryError 而失败的可能性大大降低。 “我想使用 Android 文件管理器打开这个文件,因为我可以收到 pdf、jpeg、txt。” - 这是什么意思?用户使用文件管理器;应用没有。

标签: android file android-intent kotlin


【解决方案1】:

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

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

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

}

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多