Android操作联系人
2019独角兽企业重金招聘Python工程师标准>>>
Android系统中的联系人也是通过ContentProvider来对外提供数据的,我们这里实现获取所有联系人、通过电话号码获取联系人、添加联系人、使用事务添加联系人。
获取所有联系人
1. Android系统中的联系人也是通过ContentProvider来对外提供数据的
2. 数据库路径为:/data/data/com.android.providers.contacts/database/contacts2.db
3. 我们需要关注的有3张表
raw_contacts:其中保存了联系人id
data:和raw_contacts是多对一的关系,保存了联系人的各项数据
mimetypes:为数据类型
4. Provider的authorites为com.android.contacts
5. 查询raw_contacts表的路径为:contacts
6. 查询data表的路径为:contacts/#/data
这个路径为连接查询,要查询“mimetype”字段可以根据“mimetype_id”查询到mimetypes表中的数据
7. 先查询raw_contacts得到每个联系人的id,在使用id从data表中查询对应数据,根据mimetype分类数据
示例:
- //查询所有联系人
- public void testGetAll() {
- ContentResolver resolver = getContext().getContentResolver();
- Uri uri = Uri.parse("content://com.android.contacts/contacts");
- Cursor idCursor = resolver.query(uri, new String[] { "_id" }, null, null, null);
- while (idCursor.moveToNext()) {
- //获取到raw_contacts表中的id
- int id = idCursor.getInt(0);
- //根据获取到的ID查询data表中的数据
- uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data");
- Cursor dataCursor = resolver.query(uri, new String[] { "data1", "mimetype" }, null, null, null);
- StringBuilder sb = new StringBuilder();
- sb.append("id=" + id);
- //查询联系人表中的
- while (dataCursor.moveToNext()) {
- String data = dataCursor.getString(0);
- String type = dataCursor.getString(1);
- if ("vnd.android.cursor.item/name".equals(type))
- sb.append(", name=" + data);
- else if ("vnd.android.cursor.item/phone_v2".equals(type))
- sb.append(", phone=" + data);
- else if ("vnd.android.cursor.item/email_v2".equals(type))
- sb.append(", email=" + data);
- }
- System.out.println(sb);
- }
- }
//查询所有联系人public void testGetAll() {ContentResolver resolver = getContext().getContentResolver();Uri uri = Uri.parse("content://com.android.contacts/contacts");Cursor idCursor = resolver.query(uri, new String[] { "_id" }, null, null, null);while (idCursor.moveToNext()) {//获取到raw_contacts表中的idint id = idCursor.getInt(0); //根据获取到的ID查询data表中的数据uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data");Cursor dataCursor = resolver.query(uri, new String[] { "data1", "mimetype" }, null, null, null);StringBuilder sb = new StringBuilder();sb.append("id=" + id);//查询联系人表中的while (dataCursor.moveToNext()) {String data = dataCursor.getString(0);String type = dataCursor.getString(1);if ("vnd.android.cursor.item/name".equals(type))sb.append(", name=" + data);else if ("vnd.android.cursor.item/phone_v2".equals(type))sb.append(", phone=" + data);else if ("vnd.android.cursor.item/email_v2".equals(type))sb.append(", email=" + data);}System.out.println(sb);}}
通过电话号码获取联系人
1. 系统内部提供了根据电话号码获取data表数据的功能,路径为:data/phones/filter/*
2. 用电话号码替换“*”部分就可以查到所需数据,获取“display_name”可以获取到联系人显示名
示例:
- //根据电话号码查询联系人名称
- public void testGetName() {
- ContentResolver resolver = getContext().getContentResolver();
- Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/1111");
- Cursor c = resolver.query(uri, new String[] { "display_name" }, null, null, null);
- while (c.moveToNext()) {
- System.out.println(c.getString(0));
- }
- }
//根据电话号码查询联系人名称public void testGetName() {ContentResolver resolver = getContext().getContentResolver();Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/1111");Cursor c = resolver.query(uri, new String[] { "display_name" }, null, null, null);while (c.moveToNext()) {System.out.println(c.getString(0));}}
添加联系人
1. 先向raw_contacts表插入id,路径为:raw_contacts
2. 得到id之后再向data表插入数据,路径为:data
示例:
- //添加联系人
- ublic void testInsert() {
- ContentResolver resolver = getContext().getContentResolver();
- Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
- ContentValues values = new ContentValues();
- // 向raw_contacts插入一条除了ID之外, 其他全部为NULL的记录, ID是自动生成的
- long id = ContentUris.parseId(resolver.insert(uri, values));
- //添加联系人姓名
- uri = Uri.parse("content://com.android.contacts/data");
- values.put("raw_contact_id", id);
- values.put("data2", "FHM");
- values.put("mimetype", "vnd.android.cursor.item/name");
- resolver.insert(uri, values);
- //添加联系人电话
- values.clear(); // 清空上次的数据
- values.put("raw_contact_id", id);
- values.put("data1", "18600000000");
- values.put("data2", "2");
- values.put("mimetype", "vnd.android.cursor.item/phone_v2");
- resolver.insert(uri, values);
- //添加联系人邮箱
- values.clear();
- values.put("raw_contact_id", id);
- values.put("data1", "zxx@itcast.cn");
- values.put("data2", "1");
- values.put("mimetype", "vnd.android.cursor.item/email_v2");
- resolver.insert(uri, values);
//添加联系人public void testInsert() {ContentResolver resolver = getContext().getContentResolver();Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");ContentValues values = new ContentValues();// 向raw_contacts插入一条除了ID之外, 其他全部为NULL的记录, ID是自动生成的long id = ContentUris.parseId(resolver.insert(uri, values)); //添加联系人姓名uri = Uri.parse("content://com.android.contacts/data");values.put("raw_contact_id", id);values.put("data2", "FHM");values.put("mimetype", "vnd.android.cursor.item/name");resolver.insert(uri, values);//添加联系人电话values.clear(); // 清空上次的数据values.put("raw_contact_id", id);values.put("data1", "18600000000");values.put("data2", "2");values.put("mimetype", "vnd.android.cursor.item/phone_v2");resolver.insert(uri, values);//添加联系人邮箱values.clear();values.put("raw_contact_id", id);values.put("data1", "zxx@itcast.cn");values.put("data2", "1");values.put("mimetype", "vnd.android.cursor.item/email_v2");resolver.insert(uri, values);}
使用事务添加联系人
1. 在添加联系人得时候是分多次访问Provider,如果在过程中出现异常,会出现数据不完整的情况,这些操作应该放在一次事务中
2. 使用ContentResolver的applyBatch(String authority,ArrayList<ContentProviderOperation> operations) 方法可以将多个操作在一个事务中执行
3. 文档位置:
file:///F:/android-sdk-windows/docs/reference/android/provider/ContactsContract.RawContacts.html
示例:
- //使用事务添加联系人
- public void testInsertBatch() throws Exception {
- ContentResolver resolver = getContext().getContentResolver();
- ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
- ContentProviderOperation operation1 = ContentProviderOperation //
- .newInsert(Uri.parse("content://com.android.contacts/raw_contacts")) //
- .withValue("_id", null) //
- .build();
- operations.add(operation1);
- ContentProviderOperation operation2 = ContentProviderOperation //
- .newInsert(Uri.parse("content://com.android.contacts/data")) //
- .withValueBackReference("raw_contact_id", 0) //
- .withValue("data2", "ZZH") //
- .withValue("mimetype", "vnd.android.cursor.item/name") //
- .build();
- operations.add(operation2);
- ContentProviderOperation operation3 = ContentProviderOperation //
- .newInsert(Uri.parse("content://com.android.contacts/data")) //
- .withValueBackReference("raw_contact_id", 0) //
- .withValue("data1", "18612312312") //
- .withValue("data2", "2") //
- .withValue("mimetype", "vnd.android.cursor.item/phone_v2") //
- .build();
- operations.add(operation3);
- ContentProviderOperation operation4 = ContentProviderOperation //
- .newInsert(Uri.parse("content://com.android.contacts/data")) //
- .withValueBackReference("raw_contact_id", 0) //
- .withValue("data1", "zq@itcast.cn") //
- .withValue("data2", "2") //
- .withValue("mimetype", "vnd.android.cursor.item/email_v2") //
- .build();
- operations.add(operation4);
- // 在事务中对多个操作批量执行
- resolver.applyBatch("com.android.contacts", operations);
- }
//使用事务添加联系人public void testInsertBatch() throws Exception {ContentResolver resolver = getContext().getContentResolver();ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();ContentProviderOperation operation1 = ContentProviderOperation //.newInsert(Uri.parse("content://com.android.contacts/raw_contacts")) //.withValue("_id", null) //.build();operations.add(operation1);ContentProviderOperation operation2 = ContentProviderOperation //.newInsert(Uri.parse("content://com.android.contacts/data")) //.withValueBackReference("raw_contact_id", 0) //.withValue("data2", "ZZH") //.withValue("mimetype", "vnd.android.cursor.item/name") //.build();operations.add(operation2);ContentProviderOperation operation3 = ContentProviderOperation //.newInsert(Uri.parse("content://com.android.contacts/data")) //.withValueBackReference("raw_contact_id", 0) //.withValue("data1", "18612312312") //.withValue("data2", "2") //.withValue("mimetype", "vnd.android.cursor.item/phone_v2") //.build();operations.add(operation3);ContentProviderOperation operation4 = ContentProviderOperation //.newInsert(Uri.parse("content://com.android.contacts/data")) //.withValueBackReference("raw_contact_id", 0) //.withValue("data1", "zq@itcast.cn") //.withValue("data2", "2") //.withValue("mimetype", "vnd.android.cursor.item/email_v2") //.build();operations.add(operation4);// 在事务中对多个操作批量执行resolver.applyBatch("com.android.contacts", operations);}
转载于:https://my.oschina.net/yuanxulong/blog/322629
Android操作联系人相关推荐
- Android下操作联系人(Contacts)
* 1.读联系人 联系人数据是存储在com.android.providers.contacts应用的数据库中的, 该应用对外提供了ContentProvider 下载原码可以得到Uri和path 查 ...
- Android手机联系人URI总结
Android手机联系人URI总结 参考来自:https://wenku.baidu.com/view/d28a2e6b2d3f5727a5e9856a561252d380eb20b2.html An ...
- Android contacts 联系人 通讯录 源码 完全解析
Android contacts 联系人 通讯录 源码 完全解析 1简介 2软件架构 3各功能模块分析 1联系人数据的显示 1联系人列表显示 2联系人详细信息数据的显示 2联系人数据的编辑和存储 1编 ...
- Android 之联系人提供程序
介绍 联系人提供程序是一个强大而又灵活的 Android 组件,用于管理设备上有关联系人数据的中央存储库. 联系人提供程序是您在设备的联系人应用中看到的数据源,您也可以在自己的应用中访问其数据,并可在 ...
- android保存联系人到通讯录
Android保存联系人 上一篇文章讲了如何获取所有联系人,这篇文章就讲下怎么保存联系人数据到本机通讯录.这里我就假设你已经拿到了要保存的联系人数据. 因为是一个工具类,所以我这里就只给一个方法了,也 ...
- Android 操作权限大全(已归纳分类)
[注:学习Android做的笔记(总结),大神勿喷.有不足之处还望不吝赐教.] Android 操作权限大全,已大部分归纳分类(还未完全),有错误的,漏掉的,还望指出,谢谢. (想有查阅不便的,上传有 ...
- Android 操作串口 (android serial port api)
Android 操作串口 (android serial port api)
- android xml文件操作类,android操作xml
android操作xml封装后的类,包括创建xml和读xml. public class XmlParserUtil { //创建xml文件 public static void createXmlF ...
- 开源一个友盟 for android 操作的封装包
开源一个友盟 for android 操作的封装包 介绍 详解 介绍 这个库,把友盟的初始化设置,自定义事件,还有使用时长进行了一层简单的封装,例如,初始化设置 UmengOption option ...
- Google Android操作系统内核编译图文教程
Google Android操作系统内核编译图文教程 和标准的Linux开发流程一样,Android平台开发的一个很重要的基础工作就是对其内核的编译和移植.本文结合Android的开发文档以及本人的实 ...
最新文章
- pandas loc()与iloc用法
- DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息
- Dz0724补丁补掉的一个xss+补掉的另外一个xss
- 机器学习笔记(十)降维和度量学习
- AtCoder Grand Contest 008: Contiguous Repainting(思维)
- 华为手机鸿蒙系统怎么样_华为自研操作系统“鸿蒙”已用于华为手机
- 2020,难过的一年
- Java Generics示例教程 - 通用方法,类,接口
- 零基础学习次世代,3D游戏建模要美术基础吗?
- 网页实现微信扫描二维码登录
- 2022.9.19 论文笔记
- mybatis替换大于号或者小于号
- 基于单片机原理的暖风机控制系统设计-毕设课设资料
- 关于Windows-Linux双系统的启动引导
- 如何防止服务器记录上网信息,服务器怎么监控上网记录
- 手机用户对手机游戏的偏好调查
- python中用于绘制各种图形、标注文本_在python中的图形上绘制常量文本-问答-阿里云开发者社区-阿里云...
- [ 网络协议篇 ] TCP三次握手四次挥手深度解析
- Vuforia+Unity AR项目开发测试
- 大一新生千万要提前准备好好看的证件照啊
热门文章
- 北师大版图形的旋转二教案_北师大版三年级数学下册微课精讲+课件教案试卷(文末下载)...
- python判断文件格式_Python判断上传文件类型
- Android7.1 Audio Debug相关方法
- Gerrit修改前一次提交的方法
- “CEPH浅析”系列之六——CEPH与OPENSTACK
- Linux3.2.8系统启动过程及启动延时初步分析
- android camera 拍照流程图
- vs2012配置opengl提示error lnk
- 计蒜客-三值排序(贪心)
- excel不显示0_Excel2007:Excel表格中完整输入身份证号码的几种方法