仅针对文件的意图过滤器

13

我们的应用程序希望出现在“通过共享”菜单中。因此,我们向我们的活动添加了这个intent-filter:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="application/*" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="text/*" />
    <data android:mimeType="video/*" />
</intent-filter>

这个方法有效,我们的应用程序出现在共享菜单中。

然而,意图过滤器并没有完全实现我们想要达到的目标:

  1. 我们希望无论文件的MIME类型是什么,都能在菜单中显示。
  2. 我们只想在文件菜单中显示。到目前为止,如果用户想分享简单文本,并且它的MIME类型为text/plain,我们的应用程序将出现在菜单中,而我们不希望它出现。

对于所有文件和仅文件,正确的意图过滤器是什么?

提前致谢。


我们尝试添加scheme=file和host=""或"*",但由于许多应用程序使用基于文件的内容共享的scheme=content,因此它不起作用。


抱歉提出一个旧问题,我尝试使用类别“android.intent.category.OPENABLE”,似乎可以正常工作。它不会显示从Chrome共享网页,而是显示从Solid Explorer共享文件。使用这个安全吗?还是最好使用方案? - Giorgio Aresu
@Giorgio Aresu,你的问题不太清楚。你尝试过两个选项吗? - Snicolas
我尝试了两种方案。按照答案中提到的方案,我的应用程序甚至不能在分享时显示;而当使用“可打开”类别分享文件管理器中的文件时,它可以正常工作,但无法从浏览器中分享纯文本。这就是我想要的:获取文件(所有MIME类型),仅获取文件(不是文本),就像你在问题中所描述的那样。进一步的测试表明,某些应用程序(如Photoshop Express、Gallery)会将URI作为纯文本或具有格式(如“image:3710”)分享,这些格式在“可打开”类别下无法正常工作。我正在努力解决这个问题…… - Giorgio Aresu
2个回答

7

我们希望在菜单中出现所有文件,无论它们的MIME类型是什么。

尝试使用MIME类型*/*

我们只希望在文件中出现。到目前为止,如果用户想要分享简单文本,因为其MIME类型将为text/plain,我们的应用程序会出现在菜单中,而我们不希望它出现。我们尝试添加scheme=file和host =“”或“*”,但由于许多应用程序使用基于文件的内容共享的scheme=content,这并不起作用。

然后使用两个 <data> 元素,一个用于scheme为content,另一个用于scheme为file

<data android:mimeType="*/*" />
<data android:scheme="content" />
<data android:scheme="file" />

然而,请注意,content方案并不意味着它一定是文件。


7
使用它后,我们不再出现在分享菜单中,无论在我们安装的任何文件浏览器中都不会出现。 - Snicolas
@Snicolas:好的,请尝试使用两个<intent-filter>元素,一个用于每个方案。 - CommonsWare
不行,使用两个意图过滤器,一个用于每个方案,也没有起作用。 - Snicolas
1
这个解决方案是正确的,但是很可能与你的应用程序共享文件的意图缺少方案信息。我认为你需要注意分享内容的内容。 - Helton Isac
所以没有办法过滤意图,只处理文件吗? - android developer

1
  1. 如果您想被任何MIME类型调用,请不要在过滤器中放置单个MIME类型
  2. scheme="file"是仅在文件上运行的答案。现在,如果第三方应用程序将数据作为content传递,则根据定义,它不再是文件

1
使用此功能后,我们将不再出现在任何已安装的文件浏览器中的共享菜单中。 - Snicolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接