Android——添加联系人
概述
方式一:使用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();}
案例代码
相关文章:
Android——添加联系人
概述 方式一:使用ContentResolver多次写入,每次写入一个字段 第一步 往手机联系人应用中的raw_contacts表添加一条记录 raw_contacts表 ContentValues values new ContentValues();// 往 raw_contacts 添加联系人记录,并获取添加后的联…...
高级 Java Redis 客户端 有哪些?
高级Java Redis客户端主要包括以下几种: 1. Redisson (https://github.com/redisson/redisson) 特点:Redisson是一个在Redis的基础上实现的Java驻留数据网格(In-Memory Data Grid)。它不仅是一个Redis的J…...
jenkins项目发布基础
随着软件开发需求及复杂度的不断提高,团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,…...
前缀和算法详解
对于查询区间和的问题,可以预处理出来一个前缀和数组 dp,数组中存储的是从下标 0 的位置到当前位置的区间和,这样只需要通过前缀和数组就可以快速的求出指定区间的和了,例如求 l ~ r 区间的和,就可以之间使用 dp[l - 1…...
Android-Handle消息传递和线程通信
本文为作者学习笔记,如有误,请各位大佬指点 目录 一、同步异步 二、Java多线程通信 三、Handler是什么 四、Handler相关的类 五、Handler常用方法 1. 发送消息 2. 接收处理消息 3. 切换线程 六、使用Handler 使用Handler更新UI 使用Handler延…...
【Kubernetes】常见面试题汇总(四十七)
目录 106.考虑一种情况,公司希望通过保持最低成本来提高效率和技术运营速度。您如何看待公司将如何实现这一目标? 107.假设一家公司想要修改其部署方法,并希望构建一个可扩展性和响应性更高的平台。您如何看待这家公司能够实现这一目标以满足…...
grafana全家桶-loki promtail收集k8s容器日志
loki是grafana旗下轻量级日志收集工具,为了减少loki对集群的影响,把loki的agent日志收集端promtail部署在k8s集群中,loki server部署在集群外面。这样简单做一个解耦,避免大量读写的应用影响到集群内业务服务。 一、promtail部署…...
HTML5+CSS+JavaScript剪子石头布游戏
HTML5CSSJavaScript剪子石头布游戏 用HTML5CSSJavaScript剪子石头布游戏实现剪子石头布游戏,游戏有成绩计数,人、机输赢情况,及平局情况。 ✂代表剪刀,▉代表石头,▓ 代表布,给出人机双方的出拳情况 游戏…...
Flask-3
文章目录 ORMFlask-SQLAlchemySQLAlchemy中的session对象数据库连接设置常用的SQLAlchemy字段类型常用的SQLAlchemy列约束选项 数据库基本操作模型类定义 数据表操作创建和删除表 数据操作基本查询SQLAlchemy常用的查询过滤器SQLAlchemy常用的查询结果方法多条件查询分页器聚合…...
Redis的基本使用
简介 传统的数据库是 关系数据库,但是Redis是键值对数据库传统的数据库是基于 磁盘存储的,但是Redis是基于 内存存储的 基于内存,读写性能更高内存是不大的,只能存储热点信息 安装 绿色软件,安装即可使用 安装服务 手…...
[241004] Linux 系统中配置文件的区别 | VirtualBox 7.1.2 发布,修复多项问题并提升性能
目录 Linux 系统中 /etc/profile, ~/.bash_profile, ~/.profile, ~/.bashrc 等配置文件的区别一、配置文件类型二、配置文件作用三、交互式登录 Shell 和非登录 Shell交互式登录 shell交互式非登录 shell 四、配置文件加载顺序五、~/.bash_profile 和 ~/.bashrc 的区别 Virtual…...
hbuilderx+uniapp+Android宠物用品商城领养服务系统的设计与实现 微信小程序沙箱支付
目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 顾客 领养…...
SVN 迁移到 GIT,并保留提交记录
1)svn账号与git账号映射 创建 user.txt ,格式如下,user.txt 放置在git base here 所选目录下即可 schacon Scott Chacon <schacongeemail.com> selse Someo Nelse <selsegeemail.com> 为了获得 SVN 使用的作者名字列表…...
【数据结构与算法】LeetCode:堆和快排
文章目录 LeetCode:堆和快排排序数组数组中的第K个最大元素 (Hot 100)前 K 个高频元素(Hot 100)数据流的中位数(Hot 100) LeetCode:堆和快排 排序数组 排序数组 双向切分实现快排…...
文档大师:打造一站式 Word 报告解决方案
前言 在政府、医院、银行、财务以及销售等领域,常常需要创建各种报告文件来展开工作汇报,譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前,这类报告主要通过 Word 制作,费时费力且难以维护&#…...
Python 数字专题:全方位解析整数
目录 1. 引言 2. 整数的基本概念 2.1 定义 2.2 整数的表示 2.3 创建整数 3. 整数的基本操作 3.1 算术运算 3.2 比较运算 3.3 位运算 4. 内置函数与方法 4.1 int() 函数 4.2 abs() 函数 4.3 pow() 函数 5. 整数的性能优化 5.1 大整数的处理 5.2 使用 numpy 6. 应…...
IP协议报文
一.IP协议报头结构 二.IP协议报头拆解 1.4位版本 实际上只有两个取值,分别是4和6,4代表的是IPv4,6代表的是IPv6。 2.4位首部长度 IP协议报头的长度也是边长的,单位是*4,这里表示的大小为0~15,当数值为1…...
【分布式微服务云原生】掌握分布式缓存:Redis与Memcached的深入解析与实战指南
掌握分布式缓存:Redis与Memcached的深入解析与实战指南 摘要: 本文深入探讨了分布式缓存在现代分布式系统中的重要性,详细分析了Redis和Memcached两种主流的分布式缓存解决方案的原理和使用场景。文章不仅提供了核心技术的深入解析ÿ…...
计算机毕业设计 基于Python的智能文献管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
如何查看NVIDIA Container Toolkit是否配置成功
要确认 NVIDIA Container Toolkit 是否已成功配置,可以按照以下步骤进行检查: 1.检查 NVIDIA 驱动程序 首先,确保你的系统已经正确安装了 NVIDIA 驱动程序,并且可以识别你的 GPU。你可以使用 nvidia-smi 命令来进行检查…...
ExternalDNS自动化DNS管理实践:实现Kubernetes服务自动注册
ExternalDNS自动化DNS管理实践:实现Kubernetes服务自动注册 一、ExternalDNS概述 ExternalDNS是一个Kubernetes控制器,能够自动同步Kubernetes资源(如Service和Ingress)到外部DNS服务商。它消除了手动管理DNS记录的繁琐工作&…...
哔哩下载姬:解锁B站视频下载的智能新方式
哔哩下载姬:解锁B站视频下载的智能新方式 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。 项…...
如何用Python快速接入Taotoken并调用多模型API完成数据清洗任务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken并调用多模型API完成数据清洗任务 对于需要处理客户数据的开发者而言,数据清洗与结构化是…...
3分钟免费搞定Windows桌面分区:NoFences让你的工作效率翻倍
3分钟免费搞定Windows桌面分区:NoFences让你的工作效率翻倍 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否厌倦了在杂乱无章的Windows桌面上浪费时间寻找文…...
如何在Windows上实现高效屏幕标注:gInk免费工具完全指南
如何在Windows上实现高效屏幕标注:gInk免费工具完全指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 你是否需要在演示时快速圈出重点,或在线…...
Sub-Zero性能优化:7个技巧让你的Plex字幕运行如飞
Sub-Zero性能优化:7个技巧让你的Plex字幕运行如飞 【免费下载链接】Sub-Zero.bundle Subtitles for Plex, as good you would expect them to be. 项目地址: https://gitcode.com/gh_mirrors/su/Sub-Zero.bundle Sub-Zero是Plex媒体服务器最强大的字幕插件之…...
uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程
uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程 【免费下载链接】uView2.0 uView UI,是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 项目地址: https://gitcode.com/gh_mirrors/…...
SQLite Viewer:3分钟学会在线查看SQLite数据库的终极方案
SQLite Viewer:3分钟学会在线查看SQLite数据库的终极方案 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 想象一下,你收到一个SQLite数据库文件,需要立即查看其…...
127、运动控制中的硬件抽象层设计
运动控制中的硬件抽象层设计 从一次电机“鬼畜”说起 去年调试一个四轴协作机器人,电机在低速运行时突然出现周期性抖动,示波器抓出来一看,电流波形每隔几十毫秒就出现一个毛刺。排查了三天,最后发现是底层驱动库里的定时器中断优先级被某个外设库给改了——硬件抽象层(…...
3分钟掌握PlantUML Editor:用代码思维绘制专业UML图表的终极指南
3分钟掌握PlantUML Editor:用代码思维绘制专业UML图表的终极指南 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 还在为复杂的UML图表绘制而烦恼吗?传统的拖拽式绘…...
