简介:
ContentProvider 是内容提供者
ContentResolver 内容解析者
ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。 关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。 那么,这里为何要使用ContentProvider 对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据。 使用ContentProvider对外共享数据的好处是统一了数据的访问方式。 ContentProvider的原理是按照一定规则暴露自己的接口给其它应用来访问自己应用的数据(其实就是自定义增删改查接口并暴露出去,让别的应用访问自己的数据)。 ContentResolver就是按照一定规则访问内容提供者的数据(其实就是调用内容提供者自定义的接口来操作它的数据)。 |
系统中提供的 ContentProvider 都需要使用 ContentResolver 来操作,操作方式,
在任何一个 Context 环境下均可以使用 getContentResolver() 拿到ContentResolver 对象
查询:
private void readSms(){
// 短信的 Uri
Uri uri = Uri.parse("content://sms");
// 查询的字段
String[] columns = {
"_id","address","type","body"};
// 查询
Cursor c = getContentResolver().query(uri,columns,null,null,null);
StringBuilder sb = new StringBuilder();
while(c.moveToNext()){
int id = c.getInt(0);
String address = c.getString(1);
int type = c.getInt(2);
String body = c.getString(3);
sb.append(id).append("\t").append(address).append("\t")
.append(type).append("\t").append(body).append("\n");
}
c.close();
tvResult.setText(sb.toString());
}
注意: 6.0 以上针对部分数据(联系人,短信)需要动态申请权限
动态申请权限
1 、检测权限是否被授权
// 检测是否授权
int permissionState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS);
if(permissionState == PackageManager.PERMISSION_GRANTED){
//已授权
}
2 、如果未授权则需要申请权限
requestPermissions(new String[]{Manifest.permission.READ_SMS},REQUST_READ_SMS);
3 、处理申请结果,需要在 Activity 中重写 onRequestPermissionsResult 方法
以申请读短信为例
检测和申请
// 检测当前系统是否是 6.0 以上
if(Build.VERSION.SDK_INT >= 23){
// 检测是否授权
int permissionState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS);
if(permissionState == PackageManager.PERMISSION_GRANTED){
// 表示已经授权
readSms();
} else {
// 申请权限
requestP