我的 Android 手机的外部存储中有一个文件(在这种情况下是模拟的)。知道它的路径和/或有一个File
代表它的对象,我如何使用 anIntent
在适当的应用程序中打开它?
我尝试的第一件事是:
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
. 我使用它的功能在下载完成时显示通知。单击其中一个通知可以完美打开文件。单击完成的通知时,我试图找到Intent
触发的源代码DownloadManager
,但没有运气。
此外,ES File Explorer 等应用程序可以导航到我的文件下载到的位置并毫无问题地打开它们。我究竟做错了什么?
仅仅是因为不再可能 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 本身是否会阻止我原来的解决方案工作?