认识安卓中的MIME Type

MIME type的缩写为(Multipurpose Internet Mail Extensions)代表互联网媒体类型(Internet media type),MIME使用一个简单的字符串组成,最初是为了标识邮件Email附件的类型,在html文件中可以使用content-type属性表示,描述了文件类型的互联网标准。

MIME类型能包含视频、图像、文本、音频、应用程序等数据。Android开发中也会常常涉及到这已概念。

一、intent过滤器中的****MIME Type

在安卓开发中有一个意图(intent)的概念,intent又分为显式的和隐式的,没有明确指定组件名的Intent为隐式意图。关于隐式intent可参考 android 隐式intent 精要 一文。对于隐式意图,Android通过定义活动的Intent Filter(意图过滤器)来匹配隐式Intent对象,当一个intent对象被一个Intent Filter进行匹配测试时,有三个方面会被参考到:动作、data (URI以及数据类型)和类别。其中的data就和MIME Type有关。

来看一个activity的Intent Filter的例子:

intent-filterandroid:label\=_"@string/menu_view"_\

actionandroid:name\=_"android.intent.action.VIEW"_/

categoryandroid:name\=_"android.intent.category.DEFAULT"_/

dataandroid:mimeType\=_"vnd.android.cursor.item/vnd.google.note"_/

</intent-filter>

在data里面定义了该过滤器的数据类型必须是vnd.android.cursor.item/vnd.google.note,一般情况下是指匹配该过滤器的intent对象所包含的URI必须是该类型的。而一个URI返回什么样的类型是在相关Provider类的getType(Uri uri)方法中决定的。上面的Intent Filter例子中,_"vnd.android.cursor.item/vnd.google.note"_这一类型属于自定义的自定义的MIME Type。

如果我们要让一个activity能打开图片这种类型的文件,那么我们可以这样定义activity的intent-filter:

在manifest文件里->activity 添加

    <actionandroid:name="android.intent.action.VIEW" />

    <categoryandroid:name="android.intent.category.DEFAULT" />

   

这样就把当前程序注册为可以打开/查看jpeg类型的图片

当在文件管理器里点击任何jpeg文件, 系统都会试图去执行你的程序。

" image/jpeg "这一类型属于标准的MIME Type。

二、Provider中的****MIME Type

Content providers能以字符串的形式返回标准的****MIME Type或者自定义的****MIME Type

在自定义的ContentProvider类中,一般会重写getType()方法,用于返回一个与URI对应的MIMEType,方法如下:

@Override

public StringgetType(Uri uri) {

   switch(sUriMatcher.match(uri)) {

       case NOTES:

           return "vnd.android.cursor.dir/vnd.google.note";

       caseNOTE_ID:

           return "vnd.android.cursor.item/vnd.google.note";

       default:

       thrownew IllegalArgumentException("Unknown URI " + uri);

   }

}

一个MIME Type由媒体类型(type)与子类型(subtype)组成,它们之间使用反斜杠/分割,形式如下:

type/subtype

例如,著名的MIMEtype text/html表明此文件的type为text(文本),subtype为html。如果一个provider让一个URI返回这样的MIME Type,意味着通过此URI查询得到的结果将是带有html标签的文本字符串。

text/html为标准的MIME Type,它的媒体类型(type)与子类型(subtype)较为简单,分别为text和html,自定义MIME type也叫做"vendor-specific" MIME types(和标准的MIME types 对应),它的type与subtype更为复杂。

自定义MIME type的Type****值

自定义MIME type的Type值总是如下两种形式:

**1.**vnd.android.cursor.**dir**代表返回结果为多列数据
2.vnd.android.cursor.**item** 代表返回结果为单列数据

(其实经过实际验证,自定义的MIME type的Type值可以为任意字符串,但是还是建议按照google的标准来)

自定义MIME type的subtype****值

自定义媒体类型的子类型subtype叫做provider-specific,android内置的provider中出现的subtype一般都比较简单。比如联系人应用中为一个电话号码创建一个新的联系人,URI对应的MIME type如下:

vnd.android.cursor.item/phone_v2

注意这里子类型subtype的值只是简单的phone_v2。

而对于一般开发者的应用而言,subtypes的值要复杂一些,具体形式可能是根据provider的authority和要查询的表名来的。例如一个包含火车时刻信息的provider,其中provider的authority为com.example.trains,provider创建的表格中有表Line1,Line2和Line3。

那么查询表Line1记录的URI一般写为

content://com.example.trains/Line1

则provider为这个URI的返回的MIME type为

vnd.android.cursor.dir/vnd.example.line1

查询表Line2中第五条记录的URI为:

content://com.example.trains/Line2/5

provider为这个URI的返回的MIME type为

vnd.android.cursor.item/vnd.example.line2