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

标签 android android-intent android-external-storage

我的 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 Tools 插件和 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/

相关文章:

android - 无法让 Easy Share Action 运行 Android

android - 图像文件缺少 exif 数据

java - 从外部存储读取图像文件并放置在 ImageView 中

android - 如何让两个TextView彼此对齐为 "wrap_content"但又在ConstraintLayout的约束范围内而不互相溢出?

java - 无法连接到 PostgreSQL 数据库,错误代码 'localhost'

java - 类作为 Android 应用程序的弹出窗口

android - 通过通知操作复制到剪贴板

android - 谷歌播放控制台说 "You can' t 编辑这个应用程序,直到你创建一个声明敏感权限的新应用程序版本“如何修复它?

android - Android Activity 的软后退按钮

android - 权限被拒绝:android.Manifest.permission.READ_EXTERNAL_STORAGE