ContentProvider读写联系人列表以及权限处理
2016-06-10 18:57
726 查看
ContentProvider简介:
一个内容提供者访问数据的中央资源库。提供者是应用程序的一部分,提供自己的操作数据的UI。然而,内容提供者主要是被其他应用程序引用,通过提供者客户对象访问提供者。提供者和提供者客户端为数据提供一个一致的,标准的接口,也处理进程间的联系和数据安全访问。
提供者向应用程序呈现数据就像一个或多张表,就像是在关系数据库里一样。一行显示一些数据类型的实例,列的每行显示实例数据集合的独立数据。
一个应用程序通过客户类ContentResolver访问内容提供者的数据。这个函数有一个在提供者对象里同名的函数,是一个ContentProvider子类的实例。函数ContentResolver提供”CRUD”的基础(创建,获取,更新,删除)函数。
拥有提供者的应用程序进程的ContentResolver对象和ContentProvider对象可以自动处理进程间的数据交换。
简而言之:ContentProvider以表的形式,向客户端提供了访问数据的API,通过ContentResolver实现进程间的数据共享。而进程间数据的共享通过uri来实现。
实现效果:
![](https://img-blog.csdn.net/20160610185019282)
这里主要的实现方法:
注意点:cursor用完之后必须要close;这里通过nameId去查的是查不到手机号码的。
其他点注释 很清楚。
权限:
这里需要注意一下
需要做6.0动态权限处理,以上做过论述,处理方式
绑定权限
添加依赖:
ContentProvider要点就是这么多。
一个内容提供者访问数据的中央资源库。提供者是应用程序的一部分,提供自己的操作数据的UI。然而,内容提供者主要是被其他应用程序引用,通过提供者客户对象访问提供者。提供者和提供者客户端为数据提供一个一致的,标准的接口,也处理进程间的联系和数据安全访问。
提供者向应用程序呈现数据就像一个或多张表,就像是在关系数据库里一样。一行显示一些数据类型的实例,列的每行显示实例数据集合的独立数据。
一个应用程序通过客户类ContentResolver访问内容提供者的数据。这个函数有一个在提供者对象里同名的函数,是一个ContentProvider子类的实例。函数ContentResolver提供”CRUD”的基础(创建,获取,更新,删除)函数。
拥有提供者的应用程序进程的ContentResolver对象和ContentProvider对象可以自动处理进程间的数据交换。
简而言之:ContentProvider以表的形式,向客户端提供了访问数据的API,通过ContentResolver实现进程间的数据共享。而进程间数据的共享通过uri来实现。
实现效果:
这里主要的实现方法:
private void getData() { ArrayList<UserModel> data = new ArrayList<>(); //获取ContentResolver对象 ContentResolver cr = getContentResolver(); //查询contacts表 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (!cursor.moveToFirst()) { Toast.makeText(this, "暂无内容", Toast.LENGTH_LONG).show(); } while (cursor.moveToNext()) { //获取联系人名字 UserModel model = new UserModel(); int nameId = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); String name = cursor.getString(nameId); model.setName(name); //获取电话号码 Cursor phoneCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID)), null, null); //可能有多个号码 if (phoneCursor.moveToNext()) { String phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); model.setPhone(phone + ";"); } //关闭cursor phoneCursor.close(); data.add(model); } //关闭cursor cursor.close(); adapter.getData(data); }
注意点:cursor用完之后必须要close;这里通过nameId去查的是查不到手机号码的。
其他点注释 很清楚。
权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
这里需要注意一下
需要做6.0动态权限处理,以上做过论述,处理方式
绑定权限
PermissionGen.with(MainActivity.this) .addRequestCode(100) .permissions( Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS) .request();
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults); } @PermissionSuccess(requestCode = 100) public void doSomething() { getData(); } @PermissionFail(requestCode = 100) public void doFailSomething() { Toast.makeText(this, "Contact permission is not granted", Toast.LENGTH_SHORT).show(); }
添加依赖:
compile 'com.lovedise:permissiongen:0.0.6'
ContentProvider要点就是这么多。
相关文章推荐
- 进程间通信之深入消息队列的详解
- Android内容提供者ContentProvider用法实例分析
- 第14章进程间通信
- 进程间通信之管道与有名管道
- Linux环境进程间通信(二): 信号(上)
- Android 使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数
- 信号发送函数kill()和raise()
- 信号捕捉函数alarm()和pause()(转)
- 信号处理函数signal()和信号集函数组
- Head First C 学习日志 第十章 进程间通信 输入输出重定向
- Head First C 第十章 进程间通信 创建管道
- Head First C 学习日志 第十章 进程间通信 捕捉信号
- Head First C 第十章 进程间通信 闹钟
- 利用Use32.dll的SendMessage实现 进程间通信
- Linux进程间通信共享内存
- Android利用LocalSocket实现Java端进程与C端进程之间的IPC
- 进程间通信
- 在Android Studio中使用AIDL实现进程之间的通信
- Android学习-四大组件(ContentProvider)
- Unix IPC进程间通信