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分类数据

示例:

[html] view plain copy print ?
  1. //查询所有联系人
  2. public void testGetAll() {
  3. ContentResolver resolver = getContext().getContentResolver();
  4. Uri uri = Uri.parse("content://com.android.contacts/contacts");
  5. Cursor idCursor = resolver.query(uri, new String[] { "_id" }, null, null, null);
  6. while (idCursor.moveToNext()) {
  7. //获取到raw_contacts表中的id
  8. int id = idCursor.getInt(0);
  9. //根据获取到的ID查询data表中的数据
  10. uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data");
  11. Cursor dataCursor = resolver.query(uri, new String[] { "data1", "mimetype" }, null, null, null);
  12. StringBuilder sb = new StringBuilder();
  13. sb.append("id=" + id);
  14. //查询联系人表中的
  15. while (dataCursor.moveToNext()) {
  16. String data = dataCursor.getString(0);
  17. String type = dataCursor.getString(1);
  18. if ("vnd.android.cursor.item/name".equals(type))
  19. sb.append(", name=" + data);
  20. else if ("vnd.android.cursor.item/phone_v2".equals(type))
  21. sb.append(", phone=" + data);
  22. else if ("vnd.android.cursor.item/email_v2".equals(type))
  23. sb.append(", email=" + data);
  24. }
  25. System.out.println(sb);
  26. }
  27. }
//查询所有联系人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”可以获取到联系人显示名

示例:

[html] view plain copy print ?
  1. //根据电话号码查询联系人名称
  2. public void testGetName() {
  3. ContentResolver resolver = getContext().getContentResolver();
  4. Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/1111");
  5. Cursor c = resolver.query(uri, new String[] { "display_name" }, null, null, null);
  6. while (c.moveToNext()) {
  7. System.out.println(c.getString(0));
  8. }
  9. }
//根据电话号码查询联系人名称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

示例:

[html] view plain copy print ?
  1. //添加联系人
  2. ublic void testInsert() {
  3. ContentResolver resolver = getContext().getContentResolver();
  4. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  5. ContentValues values = new ContentValues();
  6. // 向raw_contacts插入一条除了ID之外, 其他全部为NULL的记录, ID是自动生成的
  7. long id = ContentUris.parseId(resolver.insert(uri, values));
  8. //添加联系人姓名
  9. uri = Uri.parse("content://com.android.contacts/data");
  10. values.put("raw_contact_id", id);
  11. values.put("data2", "FHM");
  12. values.put("mimetype", "vnd.android.cursor.item/name");
  13. resolver.insert(uri, values);
  14. //添加联系人电话
  15. values.clear(); // 清空上次的数据
  16. values.put("raw_contact_id", id);
  17. values.put("data1", "18600000000");
  18. values.put("data2", "2");
  19. values.put("mimetype", "vnd.android.cursor.item/phone_v2");
  20. resolver.insert(uri, values);
  21. //添加联系人邮箱
  22. values.clear();
  23. values.put("raw_contact_id", id);
  24. values.put("data1", "zxx@itcast.cn");
  25. values.put("data2", "1");
  26. values.put("mimetype", "vnd.android.cursor.item/email_v2");
  27. 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

示例:

[html] view plain copy print ?
  1. //使用事务添加联系人
  2. public void testInsertBatch() throws Exception {
  3. ContentResolver resolver = getContext().getContentResolver();
  4. ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
  5. ContentProviderOperation operation1 = ContentProviderOperation //
  6. .newInsert(Uri.parse("content://com.android.contacts/raw_contacts")) //
  7. .withValue("_id", null) //
  8. .build();
  9. operations.add(operation1);
  10. ContentProviderOperation operation2 = ContentProviderOperation //
  11. .newInsert(Uri.parse("content://com.android.contacts/data")) //
  12. .withValueBackReference("raw_contact_id", 0) //
  13. .withValue("data2", "ZZH") //
  14. .withValue("mimetype", "vnd.android.cursor.item/name") //
  15. .build();
  16. operations.add(operation2);
  17. ContentProviderOperation operation3 = ContentProviderOperation //
  18. .newInsert(Uri.parse("content://com.android.contacts/data")) //
  19. .withValueBackReference("raw_contact_id", 0) //
  20. .withValue("data1", "18612312312") //
  21. .withValue("data2", "2") //
  22. .withValue("mimetype", "vnd.android.cursor.item/phone_v2") //
  23. .build();
  24. operations.add(operation3);
  25. ContentProviderOperation operation4 = ContentProviderOperation //
  26. .newInsert(Uri.parse("content://com.android.contacts/data")) //
  27. .withValueBackReference("raw_contact_id", 0) //
  28. .withValue("data1", "zq@itcast.cn") //
  29. .withValue("data2", "2") //
  30. .withValue("mimetype", "vnd.android.cursor.item/email_v2") //
  31. .build();
  32. operations.add(operation4);
  33. // 在事务中对多个操作批量执行
  34. resolver.applyBatch("com.android.contacts", operations);
  35. }
//使用事务添加联系人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操作联系人相关推荐

  1. Android下操作联系人(Contacts)

    * 1.读联系人 联系人数据是存储在com.android.providers.contacts应用的数据库中的, 该应用对外提供了ContentProvider 下载原码可以得到Uri和path 查 ...

  2. Android手机联系人URI总结

    Android手机联系人URI总结 参考来自:https://wenku.baidu.com/view/d28a2e6b2d3f5727a5e9856a561252d380eb20b2.html An ...

  3. Android contacts 联系人 通讯录 源码 完全解析

    Android contacts 联系人 通讯录 源码 完全解析 1简介 2软件架构 3各功能模块分析 1联系人数据的显示 1联系人列表显示 2联系人详细信息数据的显示 2联系人数据的编辑和存储 1编 ...

  4. Android 之联系人提供程序

    介绍 联系人提供程序是一个强大而又灵活的 Android 组件,用于管理设备上有关联系人数据的中央存储库. 联系人提供程序是您在设备的联系人应用中看到的数据源,您也可以在自己的应用中访问其数据,并可在 ...

  5. android保存联系人到通讯录

    Android保存联系人 上一篇文章讲了如何获取所有联系人,这篇文章就讲下怎么保存联系人数据到本机通讯录.这里我就假设你已经拿到了要保存的联系人数据. 因为是一个工具类,所以我这里就只给一个方法了,也 ...

  6. Android 操作权限大全(已归纳分类)

    [注:学习Android做的笔记(总结),大神勿喷.有不足之处还望不吝赐教.] Android 操作权限大全,已大部分归纳分类(还未完全),有错误的,漏掉的,还望指出,谢谢. (想有查阅不便的,上传有 ...

  7. Android 操作串口 (android serial port api)

    Android 操作串口 (android serial port api)

  8. android xml文件操作类,android操作xml

    android操作xml封装后的类,包括创建xml和读xml. public class XmlParserUtil { //创建xml文件 public static void createXmlF ...

  9. 开源一个友盟 for android 操作的封装包

    开源一个友盟 for android 操作的封装包 介绍 详解 介绍 这个库,把友盟的初始化设置,自定义事件,还有使用时长进行了一层简单的封装,例如,初始化设置 UmengOption option ...

  10. Google Android操作系统内核编译图文教程

    Google Android操作系统内核编译图文教程 和标准的Linux开发流程一样,Android平台开发的一个很重要的基础工作就是对其内核的编译和移植.本文结合Android的开发文档以及本人的实 ...

最新文章

  1. pandas loc()与iloc用法
  2. DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息
  3. Dz0724补丁补掉的一个xss+补掉的另外一个xss
  4. 机器学习笔记(十)降维和度量学习
  5. AtCoder Grand Contest 008: Contiguous Repainting(思维)
  6. 华为手机鸿蒙系统怎么样_华为自研操作系统“鸿蒙”已用于华为手机
  7. 2020,难过的一年
  8. Java Generics示例教程 - 通用方法,类,接口
  9. 零基础学习次世代,3D游戏建模要美术基础吗?
  10. 网页实现微信扫描二维码登录
  11. 2022.9.19 论文笔记
  12. mybatis替换大于号或者小于号
  13. 基于单片机原理的暖风机控制系统设计-毕设课设资料
  14. 关于Windows-Linux双系统的启动引导
  15. 如何防止服务器记录上网信息,服务器怎么监控上网记录
  16. 手机用户对手机游戏的偏好调查
  17. python中用于绘制各种图形、标注文本_在python中的图形上绘制常量文本-问答-阿里云开发者社区-阿里云...
  18. [ 网络协议篇 ] TCP三次握手四次挥手深度解析
  19. Vuforia+Unity AR项目开发测试
  20. 大一新生千万要提前准备好好看的证件照啊

热门文章

  1. 北师大版图形的旋转二教案_北师大版三年级数学下册微课精讲+课件教案试卷(文末下载)...
  2. python判断文件格式_Python判断上传文件类型
  3. Android7.1 Audio Debug相关方法
  4. Gerrit修改前一次提交的方法
  5. “CEPH浅析”系列之六——CEPH与OPENSTACK
  6. Linux3.2.8系统启动过程及启动延时初步分析
  7. android camera 拍照流程图
  8. vs2012配置opengl提示error lnk
  9. 计蒜客-三值排序(贪心)
  10. excel不显示0_Excel2007:Excel表格中完整输入身份证号码的几种方法