Android——添加联系人

devtools/2024/10/10 23:53:04/

概述

方式一:使用ContentResolver多次写入,每次写入一个字段

第一步

  • 往手机联系人应用中的raw_contacts表添加一条记录

raw_contacts表
在这里插入图片描述

        ContentValues values = new ContentValues();// 往 raw_contacts 添加联系人记录,并获取添加后的联系人编号Uri uri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);long rawContactId = ContentUris.parseId(uri);

第二步

  • 将对应数据通过raw_contacts中的id与data表进行关联,插入对应相应数据

data表

  • 记录了用户的通讯录所有数据,包括手机号,显示名称等,但是里面的mimetype_id表示不同的数据类型,这与表mimetypes表中的id相对应。
    在这里插入图片描述
        ContentValues name = new ContentValues();// 关联联系人编号name.put(Contacts.Data.RAW_CONTACT_ID, rawContactId);// 姓名的数据类型name.put(Contacts.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);// 联系人的姓名name.put(Contacts.Data.DATA2, contact.name);// 添加联系人姓名记录resolver.insert(ContactsContract.Data.CONTENT_URI, name);

mimetype表

在这里插入图片描述

方式二:往手机通讯录一次性添加一个联系人信息

   private void addFullContacts(ContentResolver resolver, Contact contact) {// 创建一个插入联系人主记录的内容操作器ContentProviderOperation op_main = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_NAME,null).build();// 创建一个插入联系人姓名记录的内容操作器ContentProviderOperation op_name = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)// 将第0个操作的id,即raw_contacts的id作为data表中的raw_contact_id.withValueBackReference(Contacts.Data.RAW_CONTACT_ID, 0).withValue(Contacts.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(Contacts.Data.DATA2, contact.name).build();// 创建一个插入联系人电话号码记录的内容操作器ContentProviderOperation op_phone = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)// 将第0个操作的id,即raw_contacts的id作为data表中的raw_contact_id.withValueBackReference(Contacts.Data.RAW_CONTACT_ID, 0).withValue(Contacts.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(Contacts.Data.DATA1, contact.phone).withValue(Contacts.Data.DATA2, CommonDataKinds.Phone.TYPE_MOBILE).build();// 创建一个插入联系人电子邮箱记录的内容操作器ContentProviderOperation op_email = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)// 将第0个操作的id,即raw_contacts的id作为data表中的raw_contact_id.withValueBackReference(Contacts.Data.RAW_CONTACT_ID, 0).withValue(Contacts.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE).withValue(Contacts.Data.DATA1, contact.email).withValue(Contacts.Data.DATA2, CommonDataKinds.Email.TYPE_WORK).build();// 声明一个内容操作器的列表,并将上面四个操作器添加到该列表中ArrayList<ContentProviderOperation> operations = new ArrayList<>();operations.add(op_main);operations.add(op_name);operations.add(op_phone);operations.add(op_email);try {// 批量提交四个操作resolver.applyBatch(ContactsContract.AUTHORITY, operations);} catch (OperationApplicationException e) {throw new RuntimeException(e);} catch (RemoteException e) {throw new RuntimeException(e);}}

查询联系人

   @SuppressLint("Range")private void readPhoneContacts(ContentResolver resolver) {// 先查询 raw_contacts 表,再根据 row_contacts_id 去查询 data 表Cursor cursor = resolver.query(ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts._ID}, null, null, null, null);while (cursor.moveToNext()) {int rawContactId = cursor.getInt(0);Uri uri = Uri.parse("content://com.android.contacts/contacts/" + rawContactId + "/data");Cursor dataCursor = resolver.query(uri, new String[]{Contacts.Data.MIMETYPE, Contacts.Data.DATA1, Contacts.Data.DATA2}, null, null, null);Contact contact = new Contact();while (dataCursor.moveToNext()) {String data1 = dataCursor.getString(dataCursor.getColumnIndex(Contacts.Data.DATA1));String mimeType = dataCursor.getString(dataCursor.getColumnIndex(Contacts.Data.MIMETYPE));switch (mimeType) {// 姓名case CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE:contact.name = data1;// 电话case CommonDataKinds.Phone.CONTENT_ITEM_TYPE:contact.phone = data1;// 邮箱case CommonDataKinds.Email.CONTENT_ITEM_TYPE:contact.email = data1;}}dataCursor.close();Log.d("AAAA", contact.toString());}cursor.close();}

案例代码


http://www.ppmy.cn/devtools/122010.html

相关文章

巡检机器人室内配电室应用

智能巡检系统实施背景 电力系统发展已进入电气化、自动化、智能化建设加速推进的新阶段&#xff0c;设备规模大幅增长&#xff0c;新设备、新技术加快应用&#xff0c;装备水平取得长足发展&#xff0c;与此同时设备规模大幅增长&#xff0c;新设备、新技术加快应用&#xff0…

网络基础知识笔记(四)

路由器如何转发数据 路由&#xff1a; 从源主机到目的主机转发的过程 路由器工作原理&#xff1a; 根据路由表转发数据 路由表 路由器中维护的路由条目的集合 路由器根据路由表做路径选择 默认路由 当路由器在路由表中找不到目标网路的路由条目时&#xff0c;路由器把请求转…

获取和解析JWT令牌

一、JWT令牌介绍 JWT&#xff08;JSON Web Tokens&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间以JSON对象的形式安全地传输信息。每个JWT令牌由三部分组成&#xff1a;Header&#xff0…

MongoDB聚合操作及索引底层原理

目录 链接:https://note.youdao.com/ynoteshare/index.html?id=50fdb657a9b06950fa255a82555b44a6&type=note&_time=1727951783296 本节课的内容: 聚合操作: 聚合管道操作: ​编辑 $match 进行文档筛选 ​编辑 将筛选和投影结合使用: ​编辑 多条件匹配: …

Python环境安装教程

文章目录 一、搭建Python环境1.官网下载Python2.安装Python3.检验是否安装成功 二、安装pip1.检验是否有pip2.pip升级3.模块安装4.检验模块是否安装成功5.番外&#xff1a;pip做了什么&#xff1f; 本教程是安装Windows环境下Python3.7.4 一、搭建Python环境 1.官网下载Python…

大厂面试真题-Synchronized和ReentrantLock怎么选

在选择synchronized和ReentrantLock时&#xff0c;我们需要考虑多个方面&#xff0c;包括它们的特点、性能、以及具体的使用场景。以下是一些关键的比较点和建议&#xff1a; 1. 功能特性 锁的公平性&#xff1a; synchronized是非公平锁&#xff0c;它无法控制线程的执行顺序…

Leetcode 第 417 场周赛题解

Leetcode 第 417 场周赛题解 Leetcode 第 417 场周赛题解题目1&#xff1a;3304. 找出第 K 个字符 I思路代码复杂度分析 题目2&#xff1a;3305. 元音辅音字符串计数 I思路代码复杂度分析 题目3&#xff1a;3306. 元音辅音字符串计数 II思路代码复杂度分析 题目4&#xff1a;33…

深入计算机语言之C++:C到C++的过度

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、什么是C C&#xff08;c plus plus&#xff…