一、什么是内容提供者ContentProvider,有什么用?
Android四大组件之一,用于跨应用数据共享,我们自己的应用可以通过使用ContentProvider机制获取联系人信息,短信,媒体库等信息。
不要以为只能操作数据库数据。
二、怎么通过内容提供者获得其他应用的信息?
用getContentResolver().query()/insert()/update()/delete()等方法对表进行操作;
如:获取联系人名字和手机号
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, null, null, null);
while (cursor.moveToNext()) {
// 获取联系人姓名
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
// 获取联系人手机号
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
上面的常量CONTENT_URI,DISPLAY_NAME,NUMBER都是ContactsContract.CommonDataKinds.Phone类封装好的。
记得声明权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
三、怎么内容提供者对其他应用暴露数据?
创建MyProvider继承自ContentProvider,重写里面的onCreate(),query(),insert(),delete(),update(),getType()等方法,其他应用调用相应的方法即可获得数据。
在接下去讲之前先补下准备知识:
1、内容URI:在ContentResolver的增删改查的方法中都会传入一个Uri,这是内容提供器中的数据的唯一标识符,由权限(authority)和路径(path)构成,权限一般写包名,路径根据业务定,当然,这样只是为了保证唯一性,写其他的也不会错;
2、内容URI写法:(1)以路径结尾 content://包名.provider/表名(如:content://com.talentclass.talent.provider/table);
(2)以id结尾 content://包名.provider/表名/(如:content://com.talentclass.talent.provider/table/1/name 表示操作table表中id为1的name字段);
3、将内容URI解析成Uri对象的方法:Uri uri = Uri.parse("content://com.talentclass.talent.provider/table");
可以用UriMatcher,该类有一个addURI()方法,传入权限、路径和一个自定义代码,在后面调用UriMatcher的match()方法时传入Uri时就可以判断对哪部分内容进行操作。
getType()用于获取 Uri 对象所对应的 MIME 类型,格式如下:
1、以vnd.开头;
2、如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URI 以 id 结尾,则后接 android.cursor.item/。
3、加上vnd.权限.路径。
content://com.talentclass.talent.provider/table对应:vnd.android.cursor.dir/vnd.com.talentclass.talent.provider.table
content://com.talentclass.talent.provider/table/1对应:vnd.android.cursor.item/vnd.com.talentclass.talent.provider.table