您的位置:首页 > 移动开发 > Android开发

ANDROID中vnd.android.cursor的解释

2016-07-25 20:33 302 查看
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 添加

<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表明此文件的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

学习到Content Provider,遇到自定义MIME类型vnd.android.cursor,一直看不懂是什么。其实vnd是vendor-specific的意思,下面是我好不容易找到的详细解释,分析给大家。

引用MIME类型Contentprovider可以返回标准的MIME类型或自定义的MIME类型字符串,或同时返回两者。

MIME类型具有以下形式:type/subtype。

例如,世人皆知的MIME类型text/html具有text类型和html子类型。如果provider从一个URI返回此类型,这表示面向此URI的查询将返回带有HTML标记的文本。

自定义的MIME字符串,也被叫做"vendor-specific"MIME类型,具有更复杂的类型和子类型值,此类型的值总是这样

vnd.android.cursor.dir。用于多行,或这样

vnd.android.cursor.item。用于单行。

而子类型是每个provider都不相同的。Android内置的provider通常具有一个间单的字类型。例如,当联系人应用为一个电话号码创建一个新行时,它为新行设置下面的MIME类型:

vnd.android.cursor.item/phone_v2

可以看到子类型的值只是简单的phone_v2.

其它provider开发者可能基于provider的authority和表名字创建他们自己的子类型式样。例如,假设一个provider含有列车时刻表,provider的authority是com.example.trains,并且它包含三个表:线路1,线路2,线路3。在URI的响应中,

content://com.example.trains/Line1。指向线路1表,provider返回对应的MIME类型为:

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

而content URI:content://com.example.trains/Line2/5。指向线路2表的第5行,provider返回的对应的MIME类型为:

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

大多数contentproviders定义了契约类来包含它们所用到的MIME类型。例如,联系人Provider的契约类ContactsContract.RawContacts,定义了常量CONTENT_ITEM_TYPE,它对应于一行原始的联系人数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: