Android之使用ContentResolver对通信录中的数据进行简单操作

使用ContentResolver来对通讯录进行增删改查 使用ContentResolver来对通讯录进行增删改查通讯录数据库分析相关uri增删改查查询添加修改删除 通讯录数据库分析 在通讯录这个应用里有个特别重要的三个表,分别为:raw_contacts、data、mimetype。 1、raw_contacts表保存联系人的ID 例如:contact_id = 0; 2、data表保存联系人的数据,字段data1存放数据,mimetype_id 存放数据类型,raw_contacts_id字段表示保存数据属于那个人联系人的 3、mimetype表保存数据类型 阅读详情

1.加入读写权限

Xhtml代码 复制代码
  1. <uses-permission android:name="android.permission.READ_CONTACTS" />
  2. <uses-permission android:name="android.permission.WRITE_CONTACTS" />

<uses-permission android:name="android.permission.READ_CONTACTS" /><uses-permission android:name="android.permission.WRITE_CONTACTS" />

联系人信息Uri:

content://com.android.contacts/contacts

联系人电话Uri:

content://com.android.contacts/data/phones

联系人Email Uri:

content://com.android.contacts/data/emails


(推荐)也可以这样获取联系人信息Uri:Uri uri = ContactsContract.Contacts.CONTENT_URI;



2.查询与添加联系人的操作(单元测试用例)


Java代码 复制代码
  1. public class ContactTest extends AndroidTestCase
  2. {
  3. private static final String TAG = "ContactTest";

  4. /**
  5. * 获取通讯录中所有联系人的简单信息
  6. * @throws Throwable
  7. */
  8. public void testGetAllContact() throws Throwable
  9. {
  10. //获取联系人信息的Uri
  11. Uri uri = ContactsContract.Contacts.CONTENT_URI;
  12. //获取ContentResolver
  13. ContentResolver contentResolver = this.getContext().getContentResolver();
  14. //查询数据,返回Cursor
  15. Cursor cursor = contentResolver.query(uri, null, null, null, null);
  16. while(cursor.moveToNext())
  17. {
  18. StringBuilder sb = new StringBuilder();
  19. //获取联系人的ID
  20. String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
  21. //获取联系人的姓名
  22. String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  23. //构造联系人信息
  24. sb.append("contactId=").append(contactId).append(",Name=").append(name);
  25. //查询电话类型的数据操作
  26. Cursor phones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  27. null,
  28. ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,
  29. null, null);
  30. while(phones.moveToNext())
  31. {
  32. String phoneNumber = phones.getString(phones.getColumnIndex(
  33. ContactsContract.CommonDataKinds.Phone.NUMBER));
  34. //添加Phone的信息
  35. sb.append(",Phone=").append(phoneNumber);
  36. }
  37. phones.close();

  38. //查询Email类型的数据操作
  39. Cursor emails = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
  40. null,
  41. ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,
  42. null, null);
  43. while (emails.moveToNext())
  44. {
  45. String emailAddress = emails.getString(emails.getColumnIndex(
  46. ContactsContract.CommonDataKinds.Email.DATA));
  47. //添加Email的信息
  48. sb.append(",Email=").append(emailAddress);
  49. }
  50. emails.close();
  51. Log.i(TAG, sb.toString());
  52. }
  53. cursor.close();
  54. }

  55. /**添加联系人的第一种方法:
  56. * 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
  57. * 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
  58. */
  59. public void testInsert()
  60. {
  61. ContentValues values = new ContentValues();
  62. //首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
  63. Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values);
  64. //获取id
  65. long rawContactId = ContentUris.parseId(rawContactUri);
  66. //往data表入姓名数据
  67. values.clear();
  68. values.put(Data.RAW_CONTACT_ID, rawContactId); //添加id
  69. values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//添加内容类型(MIMETYPE)
  70. values.put(StructuredName.GIVEN_NAME, "凯风自南");//添加名字,添加到first name位置
  71. this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
  72. //往data表入电话数据
  73. values.clear();
  74. values.put(Data.RAW_CONTACT_ID, rawContactId);
  75. values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
  76. values.put(Phone.NUMBER, "13921009789");
  77. values.put(Phone.TYPE, Phone.TYPE_MOBILE);
  78. this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
  79. //往data表入Email数据
  80. values.clear();
  81. values.put(Data.RAW_CONTACT_ID, rawContactId);
  82. values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
  83. values.put(Email.DATA, "kesenhoo@gmail.com");
  84. values.put(Email.TYPE, Email.TYPE_WORK);
  85. this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
  86. }

  87. /**添加联系人的第二种方法:
  88. * 批量添加联系人
  89. * @throws Throwable
  90. */
  91. public void testSave() throws Throwable
  92. {
  93. //官方文档位置:reference\android\provider\ContactsContract.RawContacts.html
  94. //建立一个ArrayList存放批量的参数
  95. ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
  96. int rawContactInsertIndex = ops.size();
  97. ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
  98. .withValue(RawContacts.ACCOUNT_TYPE, null)
  99. .withValue(RawContacts.ACCOUNT_NAME, null)
  100. .build());
  101. //官方文档位置:reference\android\provider\ContactsContract.Data.html
  102. //withValueBackReference后退引用前面联系人的id
  103. ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
  104. .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
  105. .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
  106. .withValue(StructuredName.GIVEN_NAME, "小明")
  107. .build());
  108. ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
  109. .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
  110. .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
  111. .withValue(Phone.NUMBER, "13671323809")
  112. .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
  113. .withValue(Phone.LABEL, "手机号")
  114. .build());
  115. ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
  116. .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
  117. .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
  118. .withValue(Email.DATA, "kesen@gmail.com")
  119. .withValue(Email.TYPE, Email.TYPE_WORK)
  120. .build());
  121. ContentProviderResult[] results = this.getContext().getContentResolver()
  122. .applyBatch(ContactsContract.AUTHORITY, ops);
  123. for(ContentProviderResult result : results)
  124. {
  125. Log.i(TAG, result.uri.toString());
  126. }
  127. }
  128. }

学Simulink--基础光伏储能场景实例:基于Simulink的光储微电网主从控制策略仿真 摘要:本文详细介绍基于Simulink的光储微电网主从控制策略仿真方法。通过"储能V/f控制+光伏PQ控制"架构,实现孤岛运行时电压频率稳定和功率平衡。文章包含系统建模步骤、核心控制算法实现(附MATLAB代码)、三种典型工况仿真测试(稳态、光伏突变、负荷波动),结果显示系统满足电压偏差<±2.5%、频率偏差<±0.3%、动态响应<1s的性能要求。最后提出双主冗余、分层控制等优化方向,为光储微电网控制提供完整仿真解决方案。 阅读详情

相关推荐

数据分析学习总结笔记02:聚类分析及其R语言实现

** 数据分析学习总结笔记02:聚类分析Cluster Analysis ** 1. 聚类分析概述 1.1 聚类分析的直观理解 在科学研究、社会调查或日常生活中,通过观察个体的特征,将群体中的个体归为不同的族群/簇(Cluster)。 2. 聚类分析的方法 3. 聚类分析的应用 3.1 市场营销——精准营销 在市场营销中,基于消费者的历史交易信息、消费者背景等对消费者进行划分,从而对不同类型的消费...

weixin_41961559的博客 4421

Android Studio初学者实例:ContentProvider读取手机通讯录

其次是RecyclerView的item布局代码,其中使用了CardView是为了方便快捷的弄个圆角储来。知识点包含了RecyclerView控件、UriMatcher、ContentResolver。该实验是通过ContentProvider读取手机通讯录。先看效果,显示手机通讯录。首先是界面的布局代码。

林大大的博客 7454

千兆以太网的接收和crc校验

解析该以太网帧,包括统计该以太网帧长度+过滤功能(端口号对不对,是否为udp协议)+CRC校验,将解析结果存入状态fifo,一旦状态fifo开始有数,就开始开启读过程,读过程开始时,首先读状态fifo,根据从状态fifo里面读出的以太网帧长度,来读数据fifo(这样能够防止跨帧读),然后在根据状态fifo里面读出的crc校验正确标志和过滤标志,来确定是否将数据fifo读出来的数据送给下一个模块。改掉之后在抓一下,可以看到抓出来的数据完全正确,从最后开始看,除去4个crc校验的尾巴,数据是到255结束的。

weixin_45284871的博客 2741

获取通讯录内容,并对其进行增删改操作

获取通讯录内容,并对其进行增删改操作案例效果案例效果图思路分析模块分析主界面的功能初始化界面initView()初始化数据动态权限申请获取数据 案例效果 1.回顾recycler View控件的使用 2.实现ContentResolver的相关API 3.熟悉安卓系统中通讯录的几个关键表之间的关联 案例效果图 思路分析 1.主界面由一个recyclerView控件和一个Button控件构成。 2.长按recyclerView控件会弹出一个编辑菜单。 3.用ContentResolver来获取通信录中的数据

Barryjacket的博客 2039

USB2.0物理层实战:手把手教你用示波器抓取D+/D-信号(附波形分析)

本文是一份针对硬件工程师的USB2.0物理层信号调试实战指南。文章详细讲解了如何使用示波器捕获和分析D+/D-差分信号,从基础设置、核心信号状态解读,到信号完整性分析与常见问题排查,手把手教你定位USB通信故障。内容涵盖USB2.0协议物理层关键概念,并附有基础解码思路,旨在提升工程师的底层调试能力。

s8t9u0v1w的博客 456

数仓建模—数据语义层

如今,企业产生大量数据,需要以正确的方式进行分析才能做出重要决策。数据可能来自多个来源并采用不同的格式,这使得清楚地了解其含义和重要性成为一项挑战。这就是语义层的用武之地。语义层存在于数据仓库和最终用户使用的应用程序之间。它为用户提供了简化且一致的数据视图,无论其基础数据源的复杂性如何。该逻辑层有助于映射物理数据结构以创建概念数据模型。它定义了数据元素之间的所有规则和关系,并以业务术语提供了数据的通用词汇表。然后,用户可以轻松地与数据进行交互,而无需了解其数据源的技术知识。

7万+

Android——ContentResolver的使用——实验6

 掌握常用布局和基本控件的使用方法 掌握文本控件和RecyclerView控件的属性功能及使用方法 掌握ContactInfo类的使用方法申请读取手机通讯录的权限,将数据显示到通讯录界面上。在AndroidMainfest.xml文件中添加读取系统通讯录的权限。运行Contacts程序,查看通讯录界面效果。

qq_64628470的博客 9036

分布式优化 (Distributed Optimization) 算法详解及案例分析

分布式优化是一种将优化问题分解为多个子问题并在多个计算节点上并行求解的方法。其目标是通过分布式计算资源高效地求解大规模优化问题。

闲人编程的博客 2714

Android开发之通过ContentResolver操作通讯录

public class TestContact extends AndroidTestCase { //获取所有联系人的信息 public void getAllContactInfo() throws Exception{ String rawbase = "content://com.android.contacts/raw_contacts"; String da

liu537192的专栏 1170

《QGIS快速入门与应用基础》191:渐变区间设置(等间隔/分位数)

深入解析QGIS中渐变符号化的核心环节——渐变区间设置,重点对比等间隔与分位数两种主流模式的原理与应用。作者指出,90%的渐变效果问题源于区间设置不当,强调必须先分析数据分布特征(通过统计面板查看直方图、极值等)再选择匹配模式。等间隔模式适用于均匀分布数据(如海拔、温度),将数值范围均等划分;分位数模式则针对偏态数据(如GDP、人口),保证每个区间要素数量相等。文章通过界面示意图、效果对比图和操作步骤详解,指导读者根据数据类型选择合适区间模式,并提醒常见避坑要点:社会经济数据禁用等间隔、分类数不超过8类。

LuckyHanMo的博客 321

Freeswitch DTMF 按键无法接收问题修复

freeswitch 在接收到 update后,会更新成新的 payload type,但是给的200响应,仍然是旧的,这时候就会导致手机侧认识需要发送旧的payload,所以发到 fs 后就会导致直接丢包,不去处理RTP包了。呼叫时需要设置通道变量 rtp_manual_rtp_bugs=ACCEPT_ANY_PAYLOAD ,这时候FS 就不会对包的payload进行判断,直接判定通过。应该修复 freeswitch 给响应时,应该根据收到的 payload 发送给手机,但是一直未找到正确的路径。

2301_81507069的博客 374

android contentresolver 批量,Android之使用ContentResolver对通信录中的数据进行简单操作...

public class ContactTest extends AndroidTestCase{private static final String TAG = "ContactTest";/*** 获取通讯录中所有联系人的简单信息* @throws Throwable*/public void testGetAllContact() throws Throwable{//获取联系人信息的Ur...

weixin_29174013的博客 739

使用Everything清理垃圾文件的实战方案(持续更新)

本文主要介绍了使用Everything清理垃圾文件的实战方案,希望能对同学们有所帮助。 文章目录 1. Everything工作原理简述 2. Everything实战清理垃圾文件 2.1 清理应用无用文件 2.2 清理无用但遗忘的文件 2.3 使用Python代码自动化删除重复文件

weixin_43178406的博客 2万+

android----通信录操作

使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作: 加入读写联系人信息的权限 、 加入读取联系人信息的权限 content://com.android.contacts/contacts 操作的数据是联系人信息Uri content://com.android.contacts/data/phones 联系人电话Uri content:/

d_x_y123的博客 543

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ContentResolver(通信录操作)

通信录操作 使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作: 加入读写联系人信息的权限   添加与查询代码请见ppt下方   北京传智播客教育 www.itcast.cn 幻灯片57 监听ContentProvider中数据的变化 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,

Java,Android软件开发 662

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android-数据存储(Content Provider ,调用系统 联系人 ContentProvider实现查询和增加联系人)

1.回顾    上篇学习了 安卓的 文件存储 ,包括  存储在 sd卡上; 2.重点    (1)了解 四大组件之一 Content Provider    (2)实现 查询通信录中 联系人   (3)实现 新增联系人到通信录 3.介绍  (1) ContentProvider相对于其它的方式比较复杂,当然其功能相对于其它的方式也是革命性的改变。  (2)它能够实现

原小明 4033

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ContentProvider往通讯录添加联系人和获取联系人

http://www.cnblogs.com/linjiqin/archive/2011/05/30/2063669.html 在Android中,可以使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作。 在对联系人进行操作时需加入以下两个权限   content://com.android.contacts/contac

红豆和绿豆的博客 1039

【Android实验】基于SQLite的通信录

基于SQLite的通信录 文章目录基于SQLite的通信录实验目的知识点回顾实验内容与步骤1. 实现基于SQLite数据库通信录应用2. 增加批量删除功能。实验问题 实验目的 掌握SQLiteOpenHelper类结构 掌握基于SQLite数据库的应用开发过程 掌握ContentProvider发布数据的方法 掌握ContentResolver获取数据的方法 知识点回顾 Android系统中集...

xbean1028的博客 3469

Android通信录操作

使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作: 加入读写联系人信息的权限   代码如下: public class ContactTest extends AndroidTestCase {  private static final String TAG = "ContactTest";    public void testG

水迹专栏 773

Android 通信录操作

使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作: 加入读写联系人信息的权限 测试形式的代码示例: package cn.itcast.contact; import android.content.ContentUris; import android.content.ContentValues; import android.database

打字打不快的屌丝 927

Android存储之MediaStore的使用

上文中提到了Android提供内容的叫ContentProvider,那么在Android中怎么区分各个Provider?有的是提供联系人的,有的是提供图片的,有的是提供视频的等等。所以就需要有一个唯一的标识来标识这个Provider,Uri(通用资源标识符 Universal Resource Identifier)就是起到了这个标识的作用。每一个ContentProvider都会有一个唯一的Uri地址,通过这个Uri标识可以获取到ContentProvider和其中的数据,然后进行数据操作。

XBlithe的博客 2万+

Android 通信录中的联系人操作

package cn.itcast.contact; import java.util.ArrayList; import android.content.ContentProviderOperation; import android.content.ContentProviderResult; import android.content.ContentResolver; import a

壹口尘埃 1713

通信录操作

使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作: 加入读写联系人信息的权限 源代码: 加入读取联系人信息的权限 content://com.android.contacts/contacts 操作的数据是联系人信息Uri content://com.android.contacts/data/phones 联系人电话Uri content://co

Android Programmer 829

管理Android通信录

Android提供了Contacts应用程序来管理联系人,而且Android系统还为联系人管理提供了ContentProvider,这就允许其它应用程序以ContentResolver来管理联系人数据。

fengyuzhengfan的专栏 2640
上一篇: Android获取通信录个人信息
下一篇: 关于Content Provider中Contacts的一些知识
shareCode
博客等级 码龄15年 125粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值