Android基础开发-通讯录的添加和查询

案例:往手机通讯录添加信息,输入姓名和手机号。

保存的手机的表:一共有两个,一个是主表,提供一个联系人id,另外是辅表,提供id对应的手机号和姓名。

普通操作:一个表一个表的添加

代码如下:

java 复制代码
public void addContact(View view) {
//        addContacts(getContentResolver(),new Contact("pansd","17864195555"));
        Contact contact = new Contact("hello", "17864195555");
        ContentResolver contentResolver = getContentResolver();
        ContentValues values = new ContentValues();
//        values.put("hello",contact.getName());
//        values.put("phone",contact.getPhone());
        //返回的是插入的id【插入主表】
        Uri uri = contentResolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
        long rawContactId = ContentUris.parseId(uri);

        //插入关联表

        ContentValues nameValue = new ContentValues();
        //关联联系人编号
        nameValue.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);
        //关联姓名的数据类型
        nameValue.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        //关联联系人的姓名
        nameValue.put(ContactsContract.Contacts.Data.DATA2,contact.getName());
        //插入关联表
        contentResolver.insert(ContactsContract.Data.CONTENT_URI,nameValue);


        ContentValues phoneValue = new ContentValues();
        //关联联系人编号
        phoneValue.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);
        //关联电话号码的数据类型
        phoneValue.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        //关联联系人的电话号码[1代表家庭 2代表工作]
        phoneValue.put(ContactsContract.Contacts.Data.DATA1,contact.getPhone());
        phoneValue.put(ContactsContract.Contacts.Data.DATA2, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        //插入关联表
        contentResolver.insert(ContactsContract.Data.CONTENT_URI,phoneValue);


        ContentValues emailValues = new ContentValues();
        emailValues.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);
        emailValues.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
        emailValues.put(ContactsContract.Contacts.Data.DATA1,"faskdfa@163.com");
        emailValues.put(ContactsContract.Contacts.Data.DATA2, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
        contentResolver.insert(ContactsContract.Data.CONTENT_URI,emailValues);
    }

结果:

事务操作,添加联系人到主表和辅表

java 复制代码
 //事务操作【批处理操作】
    public void addContacts2(ContentResolver contentResolver,Contact contact){

        ArrayList<ContentProviderOperation> ops = new ArrayList<>();

        ContentProviderOperation op_main = ContentProviderOperation
                .newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build();

        ops.add(op_main);

        // 添加姓名信息
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName())
                .build());

        // 添加电话号码信息
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhone())
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                .build());

        try {
            // 执行批量操作
            ContentProviderResult[] results = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException | OperationApplicationException e) {
            e.printStackTrace();
        }

    }

通讯录的查询操作:

java 复制代码
 ContentResolver contentResolver = getContentResolver();
        // 查询联系人数据
        Cursor contactsCursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        if (contactsCursor != null && contactsCursor.getCount() > 0) {
            while (contactsCursor.moveToNext()) {
                String contactId = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID));
                String displayName = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                // 查询电话号码
                Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{contactId}, null);
                if (phoneCursor != null && phoneCursor.moveToFirst()) {
                    String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                    // 打印联系人姓名和电话号码
                    System.out.println("Name: " + displayName + ", Phone Number: " + phoneNumber);

                    phoneCursor.close();
                }
            }

            contactsCursor.close();
        }
相关推荐
圆号本昊2 小时前
Flutter Android Live2D 2026 实战:模型加载 + 集成渲染 + 显示全流程 + 10 个核心坑( OpenGL )
android·flutter·live2d
冬奇Lab3 小时前
ANR实战分析:一次audioserver死锁引发的系统级故障排查
android·性能优化·debug
冬奇Lab3 小时前
Android车机卡顿案例剖析:从Binder耗尽到单例缺失的深度排查
android·性能优化·debug
ZHANG13HAO3 小时前
调用脚本实现 App 自动升级(无需无感、允许进程中断)
android
圆号本昊4 小时前
【2025最新】Flutter 加载显示 Live2D 角色,实战与踩坑全链路分享
android·flutter
小曹要微笑5 小时前
MySQL的TRIM函数
android·数据库·mysql
mrsyf6 小时前
Android Studio Otter 2(2025.2.2版本)安装和Gradle配置
android·ide·android studio
DB虚空行者6 小时前
MySQL恢复之Binlog格式详解
android·数据库·mysql
liang_jy8 小时前
Android 事件分发机制(一)—— 全流程源码解析
android·面试·源码