本文主要介绍android中怎样获取系统的联系人数据

首先打开模拟器

点击联系人图标按钮

说明系统联系人数据库是空的,打开File explorer,找到data/data下面的文件夹:

将contacts2.db文件导出,添加到sqlite中的时候报错:

点击“ok”忽略之

表结构相当的复杂,首先搞清楚其中的三张表

* data表 保存联系人的数据

* raw_contacts表 保存联系人的id contact_id

* mimetypes表 保存联系人数据的类型

接下来通过模拟器添加联系人

通过sqlite刷新contacts2.db,忽略提示错误

获取联系人步骤

1. 查询raw_contacts表,把联系人的id取出来

2. 根据联系人的id,查询data表,把这个id的数据取出来

3. 根据mimetype区分数据的类型

接下来通过代码实现

  1. package com.wuyudong.getcontacts;
  2.  
  3. import android.net.Uri;
  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.content.ContentResolver;
  7. import android.database.Cursor;
  8. import android.view.Menu;
  9. import android.view.View;
  10.  
  11. public class MainActivity extends Activity {
  12.  
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. }
  18.  
  19. /**
  20. * 获取全部的联系人
  21. *
  22. * @param view
  23. */
  24. public void click(View view) {
  25. ContentResolver resolver = getContentResolver();
  26. // 1.查询raw_contacts表,把联系人的id取出来
  27. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  28. Uri datauri = Uri.parse("content://com.android.contacts/data");
  29. Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
  30. null, null, null);
  31. while (cursor.moveToNext()) {
  32. String id = cursor.getString(0);
  33. System.out.println("联系人id: " + id);
  34. // 2.根据联系人的id,查询data表,把这个id的数据取出来
  35. // 系统api查询data表的时候不是真正的查询的data表,而是查询data表的视图
  36. Cursor dataCursor = resolver.query(datauri, new String[] { "data1", "mimetype" },
  37. "raw_contact_id=?", new String[] { id }, null);
  38. while (dataCursor.moveToNext()) {
  39. String data1 = dataCursor.getString(0);
  40. System.out.println("data1=" + data1);
  41. String mimetype = dataCursor.getString(1);
  42. System.out.println("mimetype=" + mimetype);
  43. }
  44. dataCursor.close();
  45. }
  46. cursor.close();
  47.  
  48. }
  49.  
  50. }

添加权限:android.permission.READ_CONTACTS

运行后打印相关的结果:

06-18 10:59:41.556: I/System.out(2127): 联系人id: 1
06-18 10:59:41.636: I/System.out(2127): data1=110
06-18 10:59:41.636: I/System.out(2127): mimetype=vnd.android.cursor.item/phone_v2
06-18 10:59:41.646: I/System.out(2127): data1=wuyudong@wuyudong.com
06-18 10:59:41.646: I/System.out(2127): mimetype=vnd.android.cursor.item/email_v2
06-18 10:59:41.646: I/System.out(2127): data1=Wuyudong
06-18 10:59:41.646: I/System.out(2127): mimetype=vnd.android.cursor.item/name

通过上面的打印信息,可以修改程序

  1. package com.wuyudong.getcontacts;
  2.  
  3. import android.net.Uri;
  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.content.ContentResolver;
  7. import android.database.Cursor;
  8. import android.view.Menu;
  9. import android.view.View;
  10.  
  11. public class MainActivity extends Activity {
  12.  
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. }
  18.  
  19. /**
  20. * 获取全部的联系人
  21. *
  22. * @param view
  23. */
  24. public void click(View view) {
  25. ContentResolver resolver = getContentResolver();
  26. // 1.查询raw_contacts表,把联系人的id取出来
  27. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  28. Uri datauri = Uri.parse("content://com.android.contacts/data");
  29. Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
  30. null, null, null);
  31. while (cursor.moveToNext()) {
  32. String id = cursor.getString(0);
  33. System.out.println("联系人id: " + id);
  34. // 2.根据联系人的id,查询data表,把这个id的数据取出来
  35. // 系统api查询data表的时候不是真正的查询的data表,而是查询data表的视图
  36. Cursor dataCursor = resolver
  37. .query(datauri, new String[] { "data1", "mimetype" },
  38. "raw_contact_id=?", new String[] { id }, null);
  39. while (dataCursor.moveToNext()) {
  40. String data1 = dataCursor.getString(0);
  41.  
  42. String mimetype = dataCursor.getString(1);
  43. if ("vnd.android.cursor.item/name".equals(mimetype)) {
  44. System.out.println("姓名=" + data1);
  45. } else if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {
  46. System.out.println("邮箱=" + data1);
  47. } else if ("vnd.android.cursor.item/phone_v2".equals(data1)) {
  48. System.out.println("电话=" + data1);
  49. } else if ("vnd.android.cursor.item/im".equals(mimetype)) {
  50. System.out.println("QQ=" + data1);
  51. }
  52. }
  53. dataCursor.close();
  54. }
  55. cursor.close();
  56.  
  57. }
  58.  
  59. }

运行后打印相关的结果:

06-18 11:17:57.312: I/System.out(2380): 联系人id: 1
06-18 11:17:57.452: I/System.out(2380): 邮箱=wuyudong@wuyudong.com
06-18 11:17:57.452: I/System.out(2380): 姓名=Wuyudong
06-18 11:17:57.452: I/System.out(2380): QQ=11111111
06-18 11:17:57.482: I/System.out(2380): 联系人id: 2
06-18 11:17:57.572: I/System.out(2380): QQ=32423423422
06-18 11:17:57.572: I/System.out(2380): 邮箱=wu@wuyudong.com
06-18 11:17:57.572: I/System.out(2380): 姓名=Zhangsan

最后将这些操作封装成api,便于以后使用

新建ContactInfoParser.java文件

  1. package com.wuyudong.getcontacts.service;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import com.wuyudong.getcontacts.domain.ContactInfo;
  7.  
  8. import android.content.ContentResolver;
  9. import android.content.Context;
  10. import android.database.Cursor;
  11. import android.net.Uri;
  12.  
  13. public class ContactInfoParser {
  14. /**
  15. * 获取系统全部联系人的api方法
  16. *
  17. * @param context
  18. * @return
  19. */
  20. public static List<ContactInfo> findAll(Context context) {
  21. ContentResolver resolver = context.getContentResolver();
  22. // 1.查询raw_contacts表,把联系人的id取出来
  23. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  24. Uri datauri = Uri.parse("content://com.android.contacts/data");
  25. List<ContactInfo> infos = new ArrayList<ContactInfo>();
  26. Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
  27. null, null, null);
  28. while (cursor.moveToNext()) {
  29. String id = cursor.getString(0);
  30. if (id != null) {
  31. System.out.println("联系人id: " + id);
  32. ContactInfo info = new ContactInfo();
  33. info.setId(id);
  34. // 2.根据联系人的id,查询data表,把这个id的数据取出来
  35. // 系统api查询data表的时候不是真正的查询的data表,而是查询data表的视图
  36. Cursor dataCursor = resolver.query(datauri, new String[] {
  37. "data1", "mimetype" }, "raw_contact_id=?",
  38. new String[] { id }, null);
  39. while (dataCursor.moveToNext()) {
  40. String data1 = dataCursor.getString(0);
  41. String mimetype = dataCursor.getString(1);
  42. if ("vnd.android.cursor.item/name".equals(mimetype)) {
  43. System.out.println("姓名=" + data1);
  44. info.setName(data1);
  45.  
  46. } else if ("vnd.android.cursor.item/email_v2"
  47. .equals(mimetype)) {
  48. System.out.println("邮箱=" + data1);
  49. info.setEmail(data1);
  50. } else if ("vnd.android.cursor.item/phone_v2".equals(data1)) {
  51. System.out.println("电话=" + data1);
  52. info.setPhone(data1);
  53. } else if ("vnd.android.cursor.item/im".equals(mimetype)) {
  54. System.out.println("QQ=" + data1);
  55. info.setQq(data1);
  56. }
  57.  
  58. }
  59. infos.add(info);
  60. System.out.println("-------");
  61. dataCursor.close();
  62. }
  63. }
  64. cursor.close();
  65. return infos;
  66.  
  67. }
  68.  
  69. }

新建ContactInfo.java

  1. package com.wuyudong.getcontacts.domain;
  2.  
  3. public class ContactInfo {
  4.  
  5. private String name;
  6. private String id;
  7. private String phone;
  8. private String email;
  9. private String qq;
  10.  
  11. @Override
  12. public String toString() {
  13. return "ContactInfo [name=" + name + ", id=" + id + ", phone=" + phone
  14. + ", email=" + email + ", qq=" + qq + "]";
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getId() {
  23. return id;
  24. }
  25. public void setId(String id) {
  26. this.id = id;
  27. }
  28. public String getPhone() {
  29. return phone;
  30. }
  31. public void setPhone(String phone) {
  32. this.phone = phone;
  33. }
  34. public String getEmail() {
  35. return email;
  36. }
  37. public void setEmail(String email) {
  38. this.email = email;
  39. }
  40. public String getQq() {
  41. return qq;
  42. }
  43. public void setQq(String qq) {
  44. this.qq = qq;
  45. }
  46.  
  47. }

最后调用相关api

  1. package com.wuyudong.getcontacts;
  2.  
  3. import java.util.List;
  4.  
  5. import com.wuyudong.getcontacts.domain.ContactInfo;
  6. import com.wuyudong.getcontacts.service.ContactInfoParser;
  7.  
  8. import android.net.Uri;
  9. import android.os.Bundle;
  10. import android.app.Activity;
  11. import android.content.ContentResolver;
  12. import android.database.Cursor;
  13. import android.view.Menu;
  14. import android.view.View;
  15.  
  16. public class MainActivity extends Activity {
  17.  
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. }
  23.  
  24. /**
  25. * 获取全部的联系人
  26. *
  27. * @param view
  28. */
  29. public void click(View view) {
  30. List<ContactInfo> infos = ContactInfoParser.findAll(this);
  31. for (ContactInfo info : infos) {
  32. System.out.println(info.toString());
  33. }
  34.  
  35. }
  36.  
  37. }

Android 获取系统的联系人的更多相关文章

  1. [android] 获取系统的联系人信息

    内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者. 找到/data/data/com.android.providers.contacts/contacts2.db ...

  2. Android获取系统时间方法的总结

    Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar ...

  3. Android 获取系统时间和网络时间

    有些时候我们的应用中只能使用网络时间,而不能使用系统的时间,这是为了避免用户关闭了使用网络时间的功能后所产生的误差. 直接上代码. 1.清单文件中网络添加权限. <!-- 访问Internet资 ...

  4. android 获取系统联系人 完全解析

    一.代码 1.ContactsEngine.java import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...

  5. android获取系统通讯录

    package com.example.administrator.yunphone.View; import android.app.Fragment; import android.databas ...

  6. Android 获取系统短信内容

    //这里通过内容提供者获取系统短信内容 Uri uri = Uri.parse("content://sms/"); String[] projection = {"_i ...

  7. Android 获取系统或SDCARD剩余空间信息(转)

    android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd卡的大小和剩余空间,获取系统内部空间也就是/system的大小和剩余空间等等.      看下读取sd卡的:Java代码 ...

  8. Android 获取系统图库和相机照片 裁剪并显示

    接上一篇 package com.example.image; import android.app.Activity; import android.content.Intent; import a ...

  9. android 获取系统硬件信息

    一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" />  ...

随机推荐

  1. 报告一个IE很奇葩的滚动条问题——百分比计算宽度为浮点数时的滚动条显示异常

    起因: 做项目的时候做了一个表格内容超过DIV容器自动横向滚动处理.别的浏览器都正常:但是在IE下面明明表格table和容器DIV宽度一致但是却出现了滚动条.如图 然后本人做实验找了半天原因终于是找到 ...

  2. VS2012连接到OSC@Git

    osc终于全面开放git库了,这是我一直期待的事,也是促使我从CSDN转回OSC社区的重要原因之一.而这次我来教大家如何用osc@git来进行简单的版本控制.对于git,我自身也是近几周才开始学习,有 ...

  3. OpenStack虚拟云桌面在携程呼叫中心的应用

    编者:本文为刘科在第六期[携程技术微分享]中的分享内容.在携程技术中心(微信号ctriptech)微信后台回复[云桌面],可加入微信交流群,和关注云桌面的小伙伴一起玩耍~ 刘科,携程系统研发云平台桌面 ...

  4. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 上一篇介绍的基本的使用方式,虽然自由度很高,但是编写的代码相对还是挺多.于是框 ...

  5. Github的第三方验证

    Github的第三方验证 随着近年来网络安全越来越受到重视,对于用户认证和用户信息保存模块的开发也提升到了一个新的高度. 一般小型网站开发的时候,由于技术水平和时间成本有限,很有可能会开发出一些或大或 ...

  6. wpf 自定义圆形按钮

    wpf 自定义圆形按钮 效果图 默认样式 获取焦点样式 点击样式 下面是实现代码: 一个是自定义控件类,一个是控件类皮肤 using System; using System.Collections. ...

  7. GitHub上下载源代码的方法

    GitHub上找到自己要下载的项目以后,有3种方法可以下载源代码. 第一种是复制该项目的地址,然后用其他软件下载: 第二种是安装了官方客户端,可以直接点击"Clone in Desktop& ...

  8. python 局部变量和全局变量 global

    当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的.这称为变量的 作用域 .所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开 ...

  9. 自行实现PHP代码注解特性

    PHP 注解 到目前为止,PHP的反射特性中是不支持注解Annotation的,但是可以支持基本的文档注释内容的获取 ReflectionMethod::getDocComment() - 从5.1. ...

  10. Appcelerator Titanium Studio: JNI_CreateJavaVM missing error

    Mac升级到Yosemite后,Titanium Studio启动不了,报Appcelerator Studio: JNI_CreateJavaVM missing error 之类的错误,重装了Or ...