1. MIME类型有什么用
那现在看看在android中,MIME类型是用来干什么的呢?
首先,MIME类型主要是Activity的Intent-filter的data域;比如下面这个Activity:
[html] view plain copy
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second" >
<intent-filter>
<action android:name="harvic.test.qijian"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/bmp"/>
</intent-filter>
</activity>
这里指定了data域的MimeType值是"image/bmp",即在利用隐式Intent匹配时,只有指定MimeType是"image/bmp"时,才能启用这个Activity,也就是说,这个Activity只能打开image/bmp类型的文件!!!!这才是MIME类型匹配的重点;
所以MIME类型在Activity中是用来指定,当前的Activity所支持打开的文件类型!!
2. ContentProvider的getType()
1、概述
现在再回过来看看ContentProvider中的getType()函数,这个函数会根据传进来的URI,生成一个代表MimeType的字符串;而此字符串的生成也有规则:
· 如果是单条记录应该返回以vnd.android.cursor.item/ 为首的字符串
· 如果是多条记录,应该返回vnd.android.cursor.dir/ 为首的字符串
至于自符串/后的字符就随便定义了。
这里考虑一个问题,为什么我们返回的MimeType,要以vnd.android.cursor.item/ 或vnd.android.cursor.dir/开头?
我们知道,MIME类型其实就是一个字符串,中间有一个“/”来隔开,“/”前面的部分是系统识别的部分,就相当于我们定义一个变量时的变量数据类型,通过这个“数据类型”,系统能够知道我们所要表示的是个什么东西。至于“/”后面的部分就是我们自已来随便定义的“变量名”了。
2. 具体作用
(2-1)Activity配置
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second" >
<intent-filter>
<action android:name="com.lynash.testActivity "/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.item/lynash.person"/> contentprovider通过getType能返回的MIME类型
</intent-filter>
</activity>
(2-2)隐式启动Activity的时候
调用方通过content Uri和action来隐式匹配Intent来启用Activity.
public static final String AUTHORITY ="com.lynash.PersonProvider";
public static final UriCONTENT_URI_FIRST = Uri.parse("content://" + AUTHORITY + "/1"); //通过这个contentprovider可返回mime type
public static Uri mCurrentURI = CONTENT_URI_FIRST;
Intent intent = new Intent();
intent.setAction("com.lynash.testActivity");
intent.setData(mCurrentURI);
startActivity(intent);
这样隐式调用通过
Action: com.lynash.testActivity
data: content:// com.lynash.PersonProvider/1
找到com.lynash.testActivity符合的activity, 查看这个activity的mime类型是不是能对data参数相匹配, 如果能, 那么就启动这个activity.不能匹配, 你给我传这个data. 我也启动不了, 我要他干什么.
(2-3)
比如打电话这个activity.
Intent intent =new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
Intent.ACTION_DIAL这个activity会通过tel:10086获取自己用的通讯录的contentprovider的type. 如果与intentfilter中的一致, 那么证明传过来的这个参数uri是可用的, 那么就打开拨号这个界面.
换一种思维, 假设传进来的是之前我们的uri content://com.lynash.PersonProvider/1.那么拨号这个activity, 通过gettype(uri) 获取mime类型, 发现类型跟自己activity intent filter里的不一致, 证明传过来的这个data是非法. 也就是无效参数, 所以我肯定不能打开拨号界面了. 无效数据, 我打开干嘛.
3. 总结ContentProvider的gettype在什么时候有用?
(1)隐式调用activity传入data数据. 且这个data数据, 是某个ContentProvider的uri参数
(2)为了防止data是activity无法处理, 所以activity才需要设置mime进行data校验
(3)为了acvity在校验自定义ContentProvider时能有结果, 所以才要实现ContentProvider的getType.