http://developer.android.com/intl/zh-CN/reference/packages.html

访问电话本权限

Android的应用程序AndroidManifest.xml中加入:<uses-permission android:name="android.permission.READ_CONTACTS"/> 权限

联系人存放的数据库

Android中的联系人都保存在一个SQLite数据库中,它的路径为:/data/data/com.android.providers.contacts/databases/contacts2.db

contacts2.db的简单介绍可访问:http://hi.baidu.com/_sherry_liu/item/50431e38bef2c24e033edc9b

在联系人数据库中,保存的都是一些小的数据表,即与把所有数据保存成一个表不同,它会对联系人的资料模块化,然后分成多个表保存。
表与表之间使用id相关联起来,这样做的目的是尽量减小数据表的规模,提高数据检索的速度,因为我们检索的时候不是每次都需要读取所有的联系人资料的,这样可以更灵活的选择我们所关心的内容,提高检索速度, 虽然分开的保存数据,可以提高检索的速度,但是也给我们带来了一些不便,就是需要把这些分开的表再重新联合起来,组成我们所需要的完整的数据。
好在这些,android已经替我们准备好了,它在数据库里面建了一些视图。并且,android也提供了很多接口,通过ContentResolver().query方法,传入不同的URI即可访问相应的数据集。
在联系人数据库里面联系人和电话号码是分别存在两个表里面的,因为存在一个联系人拥有几个号码的情况,所以android为联系人和手机号码分别单独创建了相应的视图。
联系人信息的视图里面只保存与联系人相关的资料,例如姓名,是否有手机号码等。 而手机号码资料则是每一个电话号码为一条记录,如果有一个联系人有3个号码,则里面会出现3个该联系人的记录,号码分别为他的三个号码。
如果是需要读取联系人信息,传入的URI为:ContactsContract.Contacts.CONTENT_URI
如果是需要读取手机号码信息传入的URI为:ContactsContract.CommonDataKinds.Phone.CONTENT_URI

电话本访问应用到的类

Cursor类:
android.database.Cursor:
http://developer.android.com/intl/zh-CN/reference/android/database/Cursor.html
关于Cursor的重要方法:

  • close() 关闭游标,释放资源
  • copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将其存储
  • getColumnCount() 返回所有列的总数
  • getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
  • getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
  • getColumnName(int columnIndex) 从给定的索引返回列名
  • getColumnNames() 返回一个字符串数组的列名
  • getCount() 返回Cursor 中的行数
  • moveToFirst() 移动光标到第一行
  • moveToLast() 移动光标到最后一行
  • moveToNext() 移动光标到下一行
  • moveToPosition(int position) 移动光标到一个绝对的位置
  • moveToPrevious() 移动光标到上一行

Contacts类:
android.provider.ContactsContract.Contacts:
http://developer.android.com/intl/zh-CN/reference/android/provider/ContactsContract.Contacts.html
关联存储联系人的数据表,每个记录集代表一个联系人。Contacts类定义的常量,包含了联系人表的所有列。

ContentResolver类:
android.content.ContentResolver:
http://developer.android.com/intl/zh-CN/reference/android/content/ContentResolver.html
说明:当外部应用需要数据进行添加、删除、修改和查询操作时,需要使用ContentResolver 类来完成。
关于Cursor的重要方法:

  • public Uri insert(Uri uri, ContentValues values)  该方法用于添加数据。
  • public int delete(Uri uri, String selection, String[] selectionArgs) 该方法用于删除数据。
  • public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 该方法用于更新数据。
  • public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 该方法用于获取数据。
    projection:是需要读取的字段
    selection:是数据检索的条件
    selectionArgs:是数据检索条件的参数
    sortOrder:是排序的字段

Phone类:
android.provider.ContactsContract.CommonDataKinds.Phone:
http://developer.android.com/intl/zh-CN/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html
关联电话号码数据表, 定义了查询电话号码的Url

代码逻辑

  • 首先,通过Activity的getContentResolver()得到ContentResolver的实例,检索联系人数据表。
    通过url指明检索的数据表,其他参数指明检索的条件等

    Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder)

    检索条件是很重要的,我们只想取得联系人的相关信息该怎么指明检索条件呢?

    //指明联系人姓名不能为空,并且有电话号码的联系人
    String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))";

    其他参数,如返回字段,结果的排序等,根据实际情况传入自己的设定。

  • 其次,通过游标遍历cursor数组,取得每个联系人的id等
    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {... }
  • 再次,用取得的联系人id为条件,检索该联系人的所有电话号码,再进行遍历取得每一个电话号码。
    //根据每个联系人的Id,取得该联系人的所有电话号码
    Cursor phoneCursor = activity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, selPhoneCols,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null,null);
  • 最后,关闭游标数组,释放资源。

【contacts】Phonebook电话本相关推荐

  1. Android中读取电话本Contacts联系人的所有电话号信息

    1.首先,要知道android 的contacts里的电话信息有多类:moblie,家庭,工作,传真等.如图: 2.android的Contacts是通过ContentProvider来提供的,其实a ...

  2. 如何从电话本添加联系人

    How to add contacts from phonebook 如何从电话本添加联系人 Note:API is deprecated in S60 3.2 so while using this ...

  3. python程序实例电话本-利用Python电话本小程序!这波操作你给几分?

    原标题:利用Python电话本小程序!这波操作你给几分? 最近比较忙,只能抽空的写写文章,其实我也是一个上班族,python完全是个人想学然后希望以后对工作有所帮助,2019年了,祝大家新年快乐. 2 ...

  4. C#中教你一步步实现一个电话本窗体程序

    场景 使用C#窗体程序实现一个电话本应用程序. 实现 新建窗体程序,PhoneBook 然后打开工具箱,拖拽一个ListView到窗体中 拖拽完成后点击右上角三角符号,编辑选项--编辑列. 点击添加, ...

  5. MTK优美代码赏析6:电话本里的快速排序和插入排序算法

    MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...

  6. android通过ContentProvider 取得电话本的数据

    2019独角兽企业重金招聘Python工程师标准>>> 先通过getContentResolver 方法来取得一个ContentResolver 对象,然后通过 其query 方法查 ...

  7. ios自制电话本-swift

    我了个去啊,写了一遍博文,上传后,不见了,不见了,不见了...这次就随便写写了,看代码去吧... 1.获取权限,网上也很多,直接copy就行了: func initContact(){//定义一个错误 ...

  8. python检索用人名查电话_利用Python电话本小程序!这波操作你给几分?

    原标题:利用Python电话本小程序!这波操作你给几分? 最近比较忙,只能抽空的写写文章,其实我也是一个上班族,python完全是个人想学然后希望以后对工作有所帮助,2019年了,祝大家新年快乐. 2 ...

  9. 基于java的电话本管理系统

    本程序本人写了三个类分别为PhoneBook.TelephoneItem.Ui TelephoneItem: package com.hpe.test; public class TelephoneI ...

最新文章

  1. Java swing实现Visio中对直线、曲线、折线的画及拖动删除
  2. 使用 Arthas 排查开源 Excel 组件问题
  3. xcode windows版安装使用教程
  4. 有前途的程序员的14个习惯,你有几个?
  5. mysql5.7.17初始化_mysql5.7.17初始化求助 - 墨天轮问答
  6. Android笔记 fragment的生命周期
  7. 电商夏季促销海报设计PSD模板,分解教你如何设计
  8. 微型计算机主机箱内所有部件均由,《计算机应用基础》模拟试题
  9. mysql联合索失效_mysql 联合索引生效的条件、索引失效的条件
  10. mysql主从与读写分离_MySQL主从复制与读写分离
  11. 有关wxGLCanvas的问题
  12. Kent Beck : 领导的敏捷潮
  13. 【产品】什么是虚位密码及其用途
  14. 月下夜想曲200.6(攻略2)
  15. NLP(9): 机器学习介绍,朴素贝叶斯,python高阶函数应用
  16. 重装 Windows 系统后键乱码解决方案
  17. asp通用数据库连接类 access mssql mysql_asp.net 连接mssql mysql access Excel 2007数据库
  18. 2020年哨兵数据批量下载(USGS)
  19. 动态获取织梦CMS最新更新 利于收录的SiteMap.php文件
  20. Linux用户的授权与文件的权限管理

热门文章

  1. Access、Modify、change三个时间的意思以及修改方法
  2. 【生活工作经验 八】掌握大局,MBA考前调研
  3. 无文件恶意软件感染完整指南
  4. python计算长方体的表面积_数学北师大五年级的下册的新编《长方体的表面积》课件(23页)-原创力文档...
  5. 体用UGP VR眼镜一体机下载体验玩2018《VR女友》游戏后感:太真实了!
  6. prolog全排列问题
  7. 流淌在江南的山里水里
  8. JFrame实现对打小游戏 初略写的没有封装
  9. kubectl常见命令及错误排除
  10. 怎样在线转换视频文件格式