2

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

我尝试的第一件事是:

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. 我使用它的功能在下载完成时显示通知。单击其中一个通知可以完美打开文件。单击完成的通知时,我试图找到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 本身是否会阻止我原来的解决方案工作?

4

1 回答 1

3

当我尝试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作为参数传递给构造函数的 I。使用 LogCat 查看记录的意图详细信息,我看到将 MIME 类型留给推断导致没有类型,setType在已经设置 a 后使用Uri导致由于Uri某种原因没有指定,使用setDataAndType意味着它们都被指定,导致Intent正常工作。

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

于 2014-10-30T12:22:12.770 回答