认识安卓中的MIME Type

泡在网上的日子 / 文 发表于2013-06-25 19:55 第次阅读 intent,provider

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有关。

来看一个activityIntent 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能打开图片这种类型的文件,那么我们可以这样定义activityintent-filter

manifest文件里->activity 添加

<intent-filter>

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

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

    <data android:mimeType="image/jpeg ">

</intent-filter>

这样就把当前程序注册为可以打开/查看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表明此文件的typetext(文本)subtypehtml。如果一个provider让一个URI返回这样的MIME Type,意味着通过此URI查询得到的结果将是带有html标签的文本字符串。

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

自定义MIME typeType

自定义MIME typeType值总是如下两种形式:

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

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

自定义MIME typesubtype

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

vnd.android.cursor.item/phone_v2

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


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

那么查询表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



收藏 赞 (6) 踩 (2)
上一篇:android广播接收器BroadCastReceiver详解
BroadCastReceiver简介 BroadCastReceiver源码位于:framework/base/core/java/android.content.BroadcastReceiver.java 广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroad
下一篇:Android线程模型解析(包括UI的更新)
1引言 Android一词本义指机器人,Google于2007年11月发布了以Android命名的开源移动设备综合平台,包括其基于Linux的操作系统、中间件和关键的手机应用。并且组建了开放手机联盟,其成员囊括了全球著名的各大手机生产商和移动运营商。2008年8月,Google又发