我的 Android 手机的外部存储中有一个文件(在本例中是模拟的)。知道它的路径和/或有一个代表它的 File
对象,我如何使用 Intent
在适当的应用程序中打开它?
我尝试的第一件事是:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromFile(file)));
我确信这在某一时刻是有效的,因为我测试了它并转移到应用程序的另一部分。现在它总是抛出ActivityNotFoundException
。该文件肯定存在,因为 file.exists()
返回 true
并且我知道这是正确的文件,但没有应用程序自愿打开它。
我仍然可以通过这种方式打开的唯一文件类型是 .pdf,为此选择了 Adobe Reader,尽管它不是我的设备上安装的唯一 PDF 阅读器,也没有设置为默认值。我注意到 Adobe Reader 还提供打开在线 pdf 文件的功能(它似乎是使用 Chrome 下载 pdf 的替代方法)。对我来说,这表明只有 Adobe 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/