Android四大组件分别为:1.活动Activity,2.服务Service,3.广播接收器Broadcast Receiver,4.内容提供器Content Provider
Content Provider内容提供器概念、特点及用法分类
①内容提供器概念:
内容提供器是用于在不同的app之间实现数据共享的组件,它是android中实现跨程序共享数据的标准方式。
②内容提供器特点:
允许一个app访问另一app中的数据,在此基础上还能保证被访问数据的安全性。
规避风险的做法是,内容提供器可选择性的针对部分数据进行共享。
③内容提供器用法分类:
内容提供器用法分类分为两种:
1.使用系统内部的内容提供器,读取和操作数据。
2.创建app本身的内容提供器,为程序本身的数据提供外部访问接口。
系统内部的内容提供器,举个栗子,在日常使用手机中的app时,大家应该都遇到过以下图片中的场景,有的第三方社交app想获取读取联系人:
这其实就是系统内部的内容提供器在起作用,这是android系统内部的电话簿内容提供器,除此之外还有手机存储,短信,相册,日历等都提供了类似的外部访问接口。
使用系统内部的内容提供器——以读取联系人为例子
读取联系人(READ_CONTACTS)涉及用户隐私,属于危险权限之一,需要在AndroidManifest.xml中注册:
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
之后在代码逻辑中使用运行时权限申请的逻辑;
//运行时权限的申请,读取联系人的权限
//尚未授权
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS}, 1);
}
//已授权
else {
getContacts();
}
//运行时权限,调用requestPermissions()方法会弹出申请权限选择框,两个结果都会回调此方法
//授权结果封装在grantResults中
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getContacts();
}
}
}
使用ContentResolver对象来访问内容提供器中的共享数据,并打印至日志中:
记得操作完之后,关闭cursor对象,释放资源
//获取联系人
private void getContacts() {
Cursor cursor=null;
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
//获取姓名并用log打印
Log.d(TAG, "onCreate: " + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
//获取手机号并用log打印
Log.d(TAG, "onCreate: " + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭cursor
cursor.close();
}
}
请求授权如下:
允许后查看日志信息如下,成功获取联系人姓名和电话号码: