gpt4 book ai didi

android - 无法 ACTION_VIEW 外部存储上的文件

转载 作者:搜寻专家 更新时间:2023-11-01 08:47:52 28 4
gpt4 key购买 nike

我的 Android 手机的外部存储中有一个文件(在本例中是模拟的)。知道它的路径和/或有一个代表它的 File 对象,我如何使用 Intent 在适当的应用程序中打开它?

我首先尝试的是:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromFile(file)));

我确信这在某个时候是有效的,因为我对其进行了测试并转到了应用程序的另一部分。现在它总是抛出 ActivityNotFoundException。该文件肯定存在,因为 file.exists() 返回 true 并且我知道它是正确的文件,但没有应用程序自愿打开它。

我仍然可以通过这种方式打开的唯一文件类型是 .pdf,为此选择了 Adob​​e Reader,尽管它不是我设备上安装的唯一 PDF 阅读器,也没有设置为默认阅读器。我注意到 Adob​​e Reader 还提供打开在线 pdf 文件的功能(它似乎可以替代使用 Chrome 下载 pdf)。这向我表明,只有 Adob​​e Reader 被发现与 Intent 匹配,因为该位置被认为是远程的(尽管不是在线的,因为 Chrome 和其他文件下载应用程序未被列为替代品).

我也试过明确说明 MIME 类型:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/msword");
startActivity(intent);

这会导致 Intent 与正确的应用程序匹配,但它们都无法真正打开文件。我已经使用 MIME 类型的硬编码字符串和使用 MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) 传递文件扩展名对此进行了测试。对于各种文件类型,建议了正确的应用程序,但它们都无法打开文件。

编辑:

显式设置 MIME 类型会起作用,但我犯了一个非常愚蠢的错误,我应该在答案中解释一下。

我尝试打开的文件来自互联网,借助 DownloadManager 下载到我的应用程序中。我使用它的功能在完成下载时显示通知。单击这些通知之一可以完美打开文件。我试图找到点击 DownloadManager 完成通知时触发的 Intent 的源代码,但没有成功。

此外,ES 文件资源管理器等应用程序可以导航到我的文件下载到的位置并毫无问题地打开它们。我做错了什么?

是否只是无法再对外部存储上的文件进行 ACTION_VIEW 操作?我的应用程序还临时将文件下载到内部存储,这些文件仍然可以正常打开,如下所示:

//This works for files on internal storage:
Uri uri = FileProvider.getUriForFile(context, AUTHORITY, file);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);

至于它在过去的工作,更新 Eclipse、SDK 工具插件和 Android SDK 本身是否会阻止我原来的解决方案工作?

最佳答案

当我尝试 setDataAndType 时,我一定是出于懒惰而离开了:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));

并且刚刚添加了另一行:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
intent.setType(theMimeType);

...假设它与以下内容相同:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), theMimeType);

然后我一定忘记了我实际上并没有尝试过 setDataAndType 并继续写这个问题。单独使用 setType 似乎删除了我作为参数传递给构造函数的 Uri。使用 LogCat 查看 Intent 的记录详细信息,我看到保留要推断的 MIME 类型导致没有类型,在已经设置 Uri 之后使用 setType 导致没有Uri 由于某种原因被指定,使用 setDataAndType 意味着它们都被指定,导致 Intent 正常工作。

所以我做错的是分别设置类型和数据,而不是使用 setDataAndType

关于android - 无法 ACTION_VIEW 外部存储上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26538664/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com