安卓如何确定隐式意图URI的MIME类型?

4

我目前正在学习开发Android应用程序,有一个非常基础的问题:

假设我想发送一个隐式Intent来打开指定URI链接的数据,例如"content://com.mynewauthority:8100/table1",并且我已经创建了一个自定义Content Provider来维护位于“content://com.mynewauthority:8100/table1”的SQLite表。

现在由于我没有为我的表指定MIME类型,只有URI,因此Android必须以某种方式找出它。但由于这是一个自定义制作的表,我自己决定MIME类型,所以它可能是“monkey/bananas”(猴子/香蕉),我无从得知。除了getType(URI uri)函数之外,我似乎找不到任何在Content Provider实现中指定哪些MIME类型与哪些URI相关的地方,但是Android系统在解析Intent时似乎不使用该函数。

所以我的问题是:Android如何在解析隐式Intent期间找出与自定义内容提供者相关联的URI的MIME类型?

希望我的问题足够清晰!


“这似乎并未被Android系统用于意图解析”,那么你的证据是什么? - CommonsWare
啊,抱歉,我的错!我没有以正确的方式测试我的应用程序。现在我通过更改getType()函数成功地使应用程序崩溃了。所以基本上getType(URI uri)函数被Android系统用于意图解析?这意味着Android系统可以查找与URI相关联的内容提供程序,并使用getType()函数检索MIME类型。 - user1365680
不需要使用端口号,只需在权限(com.mynewauthority)确定的正确ContentProvider上调用getType()即可。顺便说一句。 - CommonsWare
好的,太棒了。非常感谢您的及时帮助! - user1365680
2个回答

3
如果 Intent 中有 MIME 类型(参见 XGouchet 的答案),则将使用该类型。
如果 Intent 没有 MIME 类型,Android 将尝试确定 MIME 类型:
  • 对于 ContentProvider,例如您的情况,它会基于 authority 在特定 provider 上调用 getType() 方法获取 Uri 的类型。
  • 对于 http:// Uri,它会发出 HTTP HEAD 请求。
  • 对于大多数其他内容,它都会失败(例如 file:// Uri)。

0
如果您自己创建意图对象,可以使用以下方式强制附加到它的 MIME 类型:
fileType = "monkey/bananas";
intent.setDataAndType(fileUri, fileType);

顺便提一下,Android通常会通过文件扩展名来检测MIME类型,使用MimeTypeMap,但我发现这种方法相当不完整。你可以从MimeTypeMap类源代码中打印已知的文件扩展名和相关的MIME类型。


MimeTypeMap 可以被 WebView 使用,但我没有看到它被其他东西使用的证据。 - CommonsWare

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