认识安卓中的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