读取系统联系人

本文介绍如何在Android应用中使用ContentProvider进行联系人的读取、添加、删除及修改操作。提供了两种读取联系人的方式,并详细展示了增删改的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取系统联系人,添加联系人,删除联系人,修改联系人

ContentProvider读取电话号码的Uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI

ContentProvider扫描本地图片路径Uri:MediaStore.Images.Media.EXTERNAL_CONTENT_URI

ContentProvider扫描本地视频文件的URI:MediaStore.Video.Media.EXTERNAL_CONTENT_URI

ContentProvider扫描本地音频文件的URI:  MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

读取联系人需添加读取联系人的权限:    <uses-permission android:name="android.permission.READ_CONTACTS"/>
添加联系人需添加写入联系人的权限:   <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

一个程序,获取另一个程序的一些信息,需要用到contentprovider内容提供者来实现数据的获取与操作,获取系统的联系人的话,系统已经定义好了一些配备规则,自己可以参照Android系统源码,进行查看。

第一种读取联系人的方法:

         ContentResolver resolver = getContentResolver();
        // 通过查看源码得到通讯录raw_contacts表的匹配规则
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri uri2 = Uri.parse("content://com.android.contacts/data");
        Cursor cursor = resolver.query(uri, null, null, null, null);
        // 创建一个容器
        ArrayList<Contact> list = new ArrayList<Contact>();
        // 循环的是raw_contacts表
        while (cursor.moveToNext()) {
            // 获取的是联系人的id
            String _id = cursor.getString(cursor.getColumnIndex("contact_id"));
            if (_id == null) {
                continue;
            }
            Cursor cursorData = resolver.query(uri2, null, "raw_contact_id=?",
                    new String[] { _id }, null);
            Contact contact = new Contact();
            // 循环的是data表
            while (cursorData.moveToNext()) {
                // 得到的是联系人的数据 电话、邮箱存在data1
                String content = cursorData.getString(cursorData
                        .getColumnIndex("data1"));
                String mimetype = cursorData.getString(cursorData
                        .getColumnIndex("mimetype"));
                if (mimetype.equals("vnd.android.cursor.item/name")) {
                    contact.setName("姓名:" + content);
                } else if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {
                    contact.setPhone("电话:" + content);
                } else if (mimetype.equals("vnd.android.cursor.item/email_v2")) {
                    contact.setEmail("邮箱:" + content);
                }
            }
            list.add(contact);
        }

第二种读取联系人的方法:

               

这种发法,用的是已经封装好的类进行调用,来实现读取联系人的操作,比较简单

                ContentResolver resolver = getContentResolver();

                Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
                StringBuffer sb = new StringBuffer();
                while (cursor.moveToNext()) {
                    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    sb.append("姓名:"+name+"电话:"+phone);
                }

添加联系人的方法:

         ContentResolver resolver = getContentResolver();
        //通过查看源码得到通讯录raw_contacts表的匹配规则
        Uri rawUri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri dataUri = Uri.parse("content://com.android.contacts/data");
        
        Cursor rawCursor = resolver.query(rawUri, null, null, null, null);
        rawCursor.moveToLast();
        
        int id = rawCursor.getInt(rawCursor.getColumnIndex("contact_id"));
        id = id + 1;
        
        //往raw_contacts表中添加一个联系人id
        ContentValues values = new ContentValues();
        values.put("contact_id", id);
        resolver.insert(rawUri, values);
        
        //往data表中添加数据
        ContentValues phoneValues = new ContentValues();
        phoneValues.put("data1", "13546789");
        phoneValues.put("raw_contact_id", id);
        phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");
        resolver.insert(dataUri, phoneValues);
        
        
        ContentValues emailValues = new ContentValues();
        emailValues.put("data1", "wangwu@qq.com");
        emailValues.put("raw_contact_id", id);
        emailValues.put("mimetype", "vnd.android.cursor.item/email_v2");
        resolver.insert(dataUri, emailValues);
        
        ContentValues nameValues = new ContentValues();
        nameValues.put("data1", "wangwu");
        nameValues.put("raw_contact_id", id);
        nameValues.put("mimetype", "vnd.android.cursor.item/name");
        resolver.insert(dataUri, nameValues);

删除联系人的方法:

        删除联系人,需将raw_contact表中的id删除与data表中的数据要删除               

         Uri contactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
         Uri dataUri = Uri.parse("content://com.android.contacts/data");
        //删除联系人id
        getContentResolver().delete(contactsUri,"contact_id = ?", new String[]{"6"});
        //删除联系人data表中的数据
        getContentResolver().delete(dataUri, "raw_contact_id = ?", new String[]{"6"});   
    

修改联系人的方法:

        Uri dataUri = Uri.parse("content://com.android.contacts/data");
        //contact_id
        Cursor cursor = getContentResolver().query(dataUri, null, "raw_contact_id = ?", new String[]{"7"}, null);
        
        //遍历
        while(cursor.moveToNext()){
            
            String mimetype = cursor.getString(cursor.getColumnIndex("mimetype"));
            //判断用户的数据类型
            if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
                ContentValues values = new ContentValues();
                values.put("data1", "123654");
                getContentResolver().update(dataUri, values, "raw_contact_id = ? and mimetype = ?", new String[]{"7",mimetype});
            }else if("vnd.android.cursor.item/name".equals(mimetype)){
                //更新联系人的名字
            }
            
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperMonsterH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值