ContentProvider的getType()的作用

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.

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ContentProvider是Android平台中的一种组件,用于不同应用之间共享数据。以下是一个ContentProvider的简单示例。 首先,在AndroidManifest.xml文件中注册ContentProvider。示例代码如下: ``` <provider android:name=".MyContentProvider" android:authorities="com.example.myapp.provider" android:exported="true"> </provider> ``` 然后,在项目中创建一个继承自ContentProvider的类。示例代码如下: ```java public class MyContentProvider extends ContentProvider { // 数据库帮助类 private MyDatabaseHelper dbHelper; // ContentProvider创建时调用 @Override public boolean onCreate() { dbHelper = new MyDatabaseHelper(getContext()); return true; } // 查询数据 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("my_table", projection, selection, selectionArgs, null, null, sortOrder); return cursor; } // 插入数据 @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = dbHelper.getWritableDatabase(); long id = db.insert("my_table", null, values); return ContentUris.withAppendedId(uri, id); } // 更新数据 @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getWritableDatabase(); int count = db.update("my_table", values, selection, selectionArgs); return count; } // 删除数据 @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getWritableDatabase(); int count = db.delete("my_table", selection, selectionArgs); return count; } // 返回MIME类型 @Override public String getType(Uri uri) { return "vnd.android.cursor.dir/vnd.com.example.myapp.provider.my_table"; } } ``` 在示例中,query方法用于查询数据,insert方法用于插入数据,update方法用于更新数据,delete方法用于删除数据。getType方法用于返回MIME类型。 最后,在应用中通过ContentResolver进行数据的增删改查操作。示例代码如下: ```java // 查询数据 Uri uri = Uri.parse("content://com.example.myapp.provider/my_table"); Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String data = cursor.getString(cursor.getColumnIndex("data")); // 处理数据 } cursor.close(); } // 插入数据 Uri uri = Uri.parse("content://com.example.myapp.provider/my_table"); ContentValues values = new ContentValues(); values.put("data", "example data"); Uri newUri = getContentResolver().insert(uri, values); // 更新数据 Uri uri = Uri.parse("content://com.example.myapp.provider/my_table"); ContentValues values = new ContentValues(); values.put("data", "new data"); String whereClause = "data=?"; String[] whereArgs = {"example data"}; int count = getContentResolver().update(uri, values, whereClause, whereArgs); // 删除数据 Uri uri = Uri.parse("content://com.example.myapp.provider/my_table"); String whereClause = "data=?"; String[] whereArgs = {"example data"}; int count = getContentResolver().delete(uri, whereClause, whereArgs); ``` 通过上述示例,你可以了解到ContentProvider的基本使用方法。它可以将数据存储在数据库中,并通过ContentResolver进行增删改查操作,实现数据的共享和交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值