ContentProvider读写联系人列表以及权限处理

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要点就是这么多。

你可能感兴趣的:(内容提供者,进程间通信,内容访问者)