【问题标题】:How does android figure out the MIME type of a URI for an implicit Intent?android 如何找出隐式 Intent 的 URI 的 MIME 类型?
【发布时间】:2012-04-30 11:59:46
【问题描述】:

我目前正在学习开发 Android 应用程序并且有一个相当基本的问题:

假设我想发送一个隐式 Intent 来打开由 URI 链接指定的数据,例如“内容://com.mynewauthority:8100/table1”。假设我创建了一个自定义内容提供程序,它在“content://com.mynewauthority:8100/table1”维护一个 SQLite 表。

现在,由于我没有为我的表指定 MIME 类型,而只指定了它的 URI,Android 必须能够以某种方式找出它。但由于它是定制表,我自己决定 MIME 类型,所以据我所知,它可能是“猴子/香蕉”。我似乎在 Content Provider 实现中找不到任何地方,它指定了哪个 MIME 类型与哪个 URI 一起使用,除了 getType(URI uri) 函数,它似乎没有被 Android 系统用于 Intent 解析。

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

希望这个问题足够清楚!

【问题讨论】:

  • “Android 系统似乎没有将其用于 Intent 解析”——您对此的证明是,究竟是什么?
  • 对不起,我的错!我没有以正确的方式测试我的应用程序。现在我设法通过更改 getType() 函数使应用程序中断。那么基本上Android系统使用getType(URI uri)函数进行意图解析?这意味着 Android 系统可以查找与 URI 关联的内容提供程序,并使用 getType() 函数来检索 MIME 类型。
  • 不需要,只要调用右边的getType()ContentProvider,由权限(com.mynewauthority)决定。顺便说一句,您不要使用带有ContentProvider 的端口号。
  • 好的,太好了。非常感谢您的及时帮助!

标签: android android-intent mime-types android-contentprovider


【解决方案1】:

如果Intent 中包含 MIME 类型(请参阅 XGouchet 的回答),则使用该类型。

如果Intent 中没有 MIME 类型,Android 将尝试确定 MIME 类型:

  • 对于ContentProvider,就像您的情况一样,它根据权限在该Uri 的特定提供程序上调用getType()
  • 对于http:// Uri,它发出一个HTTP HEAD 请求
  • 对于大多数其他内容,它会失败(例如,file://Uri

【讨论】:

    【解决方案2】:

    如果你自己创建你的意图对象,你可以通过使用强制附加到它的 mime 类型:

    fileType = "monkey/bananas";
    intent.setDataAndType(fileUri, fileType);
    

    仅供参考,android 通常使用 MimeTypeMap 从文件扩展名中检测 mime 类型,我发现它相当不完整。您可以从 MimeTypeMap class source code 打印已知的文件扩展名和相关的 mime 类型

    【讨论】:

    • MimeTypeMap 可能被WebView 使用,但我没有看到任何证据表明它被其他许多人使用。
    猜你喜欢
    • 2016-05-09
    • 2014-09-01
    • 2011-01-14
    • 2014-08-12
    • 2013-03-13
    • 2012-09-10
    • 2020-09-07
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多