Android中的多种MIME类型


75

有没有一种使用intent.setType()和提供多种广泛类型(例如图像视频)的方法?

我正在使用ACTION_GET_CONTENT。它似乎只使用逗号分隔的类型。


1
你可以再详细一点吗。setType()on ...什么?有什么用途和目的?等等
CommonsWare,2009年

您是否找到了执行此操作的方法?
Rohith Nandakumar

Answers:


124

在Android 4.4中,当使用Storage Access Framework时,您可以使用EXTRA_MIME_TYPES传递多个mime类型。

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
String[] mimetypes = {"image/*", "video/*"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
startActivityForResult(intent, REQUEST_CODE_OPEN);

7
这在Android 7.0中不起作用。仅显示视频。
Clocksmith

@clocksmith在运行Android 7.0的Nexus 9上似乎可以正常工作。
史蒂夫·M

@clocksmith似乎也可以在Android 7.0模拟器上正常工作。是否有不起作用的特定情况?似乎这是正确的答案,因为它是官方API的一部分。
史蒂夫M

完美地工作。Android筛选文件类型的方式。
Nikhil

2
请注意,EXTRA_MIME_TYPES它不会替代setType。您仍然需要setType这种方法。
arlomedia '19

20

实际上,支持多种mime类型。你甚至尝试过吗?

例如:intent.setType("image/*,video/*") 将显示照片和视频...

对我来说,它有效。它也应该为您工作...

[编辑]:这部分起作用,因为并非所有图库应用程序都选择实现对多种mime类型过滤器的支持。


4
此解决方案正在工作...但仅适用于允许两种mime类型的应用程序。默认的“图库”没有。
Corbella

1
实际上,这取决于您已安装的“图库”应用程序。它们的不同版本随不同的android ROM一起分发。
bazyle

仅对我有用。相同的图像可能会或可能不会选择。Android 5.0.1
Ingweland 2015年

4

对我来说,最有效的方法是:

intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);


您可以添加几种类似的MIME类型

intent.setType("image/*|application/pdf|audio/*");

但是,意图选择器将仅显示可以处理图像的应用程序,因为它是mime类型字符串中的第一个。

但是,如果您安装了文件管理器(我已经使用CyanogenMod文件管理器进行了测试),则可以选择音频,pdf或图像的文件。

如果音频MIME类型是第一个,则如下所示:

intent.setType("audio/*|image/*|application/pdf");

意向选择器将仅显示处理音频的应用程序。
再次使用文件管理器,您可以选择图像或pdf或音频。


3

抱歉,目前不支持此功能。您有两种选择:

(1)使用MIME类型 */*并接受用户可能会选择的某些内容,您将无法处理(并且有适当的恢复路径);要么

(2)实现您自己的活动选择器,直接在程序包管理器上进行调用,以获取可以处理两种MIME类型意图的活动,合并这些列表并将其显示给用户。

另外,setType()根本不使用逗号分隔的类型。它必须是一种且只有一种MIME类型。


3
实际上,支持多种mime类型。你甚至尝试过吗?例如:image / *,video / *将显示照片和视频...
bazyle 2013年

@vchelbanster并非所有设备都支持多种模仿类型。对于某些Android版本(例如<5.0),它将仅选择第一个mimetype。
Shivam Pokhriyal,

@ShivamPokhriyal部分同意-并非适用于所有应用程序。由于具有复合意图类型的应用程序需要处理多种mime类型才能运行,因此并非所有应用程序(例如图库应用程序)都可以工作,这可能会给人留下印象,即它是所依赖的OS版本。实际上,是应用程序的创建者需要处理多种mime类型。是的-支持有限。看我的答案。
bazyle

@vchelbanster是的,起初我觉得这与OS版本有关。后来我发现,如果您的设备没有可处理此类意图的应用,则会出现问题。
Shivam Pokhriyal,

2

如果与|分开,则可以传递多种mime类型。

Intent.setType("application/*|text/*");

-3

我在分号上的工作

例:

intent.setType("image/*;video/*")

要么

sIntent.putExtra("CONTENT_TYPE", "image/*;video/*"); 

1
可以使用Intent.EXTRA_MIME_TYPES常量代替硬编码的“ CONTENT_TYPE”字符串。另外,您可以传递字符串数组来代替分号。
Fred
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.