认识Android中的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有关。

来看一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值