一、代码

1.ContactsEngine.java

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4.  
  5. import android.content.ContentResolver;
  6. import android.content.Context;
  7. import android.database.Cursor;
  8. import android.net.Uri;
  9.  
  10. public class ContactsEngine {
  11. /**
  12. * 获取系统联系人
  13. *
  14. * @return
  15. */
  16. public static List<HashMap<String, String>> getAllContacts(Context context) {
  17. List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
  18. // 1.获取内容解析者
  19. ContentResolver resolver = context.getContentResolver();
  20. // 2.内容提供者地址 com.android.contacts 例如百度搜索jdk:www.baidu.com/jdk
  21. // raw_contacts表地址:raw_contacts veiw_data表的地址:data
  22. // 3.生成查询地址
  23. Uri raw_uri = Uri.parse("content://com.android.contacts/raw_contacts");// http://
  24. Uri data_uri = Uri.parse("content://com.android.contacts/data");
  25. // 4.查询数据,先查询raw_contacts的contact_id
  26. // projection:查询的字段
  27. Cursor cursor = resolver.query(raw_uri, new String[] { "contact_id" },
  28. null, null, null);
  29. // 5.解析cursor
  30. while (cursor.moveToNext()) {
  31. // columnIndex : 表示字段的索引
  32. String contact_id = cursor.getString(0);
  33. // cursor.getString(cursor.getColumnIndex("contact_id"));//getColumnIndex
  34. // : 获取字段在cursor的索引,一般用在查询字段比较多的情况
  35. if (contact_id != null) {
  36. // 6.根据contact_id去查询veiw_data表, 报空指针异常的2种情况:null.方法、参数为空
  37. Cursor c = resolver.query(data_uri, new String[] { "data1",
  38. "mimetype" }, "raw_contact_id=?",
  39. new String[] { contact_id }, null);
  40. HashMap<String, String> map = new HashMap<String, String>();
  41. // 7.解析c
  42. while (c.moveToNext()) {
  43. // 获取数据
  44. String data1 = c.getString(0);
  45. String mimetype = c.getString(1);
  46. // 8.根据mimetype判断data1的类型
  47. if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {
  48. // 电话
  49. // 9.保存数据
  50. map.put("phone", data1);
  51. } else if (mimetype.equals("vnd.android.cursor.item/name")) {
  52. // 姓名
  53. map.put("name", data1);
  54. }
  55. }
  56. // 10.添加到集合中
  57. list.add(map);
  58. // 11.关闭cursor
  59. c.close();
  60. }
  61. }
  62. cursor.close();
  63. return list;
  64. }
  65. }

2.需要添加权限

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

二、单元测试

1.业务类都要进行单元测试,实际项目开发采用创建Android Test Project,创建测试类TestContacts

TestContacts.java

  1. import java.util.HashMap;
  2. import java.util.List;
  3.  
  4. import com.demo.engine.ContactsEngine;
  5.  
  6. import android.test.AndroidTestCase;
  7.  
  8. public class TestContacts extends AndroidTestCase {
  9. public void testContacts(){
  10. List<HashMap<String, String>> list = ContactsEngine.getAllContacts(getContext());
  11. for (HashMap<String, String> hashMap : list) {
  12. System.out.println("姓名:"+hashMap.get("name")+" 电话:"+hashMap.get("phone"));
  13. }
  14. }
  15. }

android 获取系统联系人 完全解析的更多相关文章

  1. android获取系统通讯录

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

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

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

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

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

  4. Android 获取系统的联系人

    本文主要介绍android中怎样获取系统的联系人数据 首先打开模拟器 点击联系人图标按钮 说明系统联系人数据库是空的,打开File explorer,找到data/data下面的文件夹: 将conta ...

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

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

  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. Ixia测试仪的自动化

    Ixia,美国Ixia公司的通信网络测试仪. 1.Ixia的自动化测试场景 测试PC(安装IxOS)AT框架-->Tcl驱动库SIG_Teq_Ixia.tcl(加载 IxTclHal库)---- ...

  2. sql server2008安装说明 详细完整版

    SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本. 在现今数据的世界里,公司要获得成功和不断发展,他们 ...

  3. 【zZ】OpenCV HOGDescriptor 参数图解

    http://blog.csdn.net/raodotcong/article/details/6239431

  4. Delphi JCL JEDI使用 jclDebug

    开源 https://github.com/project-jedi/jcl jclDebug 下载jcl,还要下载https://github.com/project-jedi/jedi里的2个in ...

  5. {POJ}{3897}{Maze Stretching}{二分答案+BFS}

    题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...

  6. WAP端 经验记录1

    1. 点击元素触发事件的先后顺序:touchstart, touchend, mousedown, mouseup, click 2. Animate 的 stop 问题问题:手机端由于用 CSS3 ...

  7. Qt 自定义消息窗口

    用于设置取消时,询问是否保存修改的DLGvoid SetWindow::cancelButton() { if( m_IsChange) { QMessageBox msgBox; msgBox.se ...

  8. poj 1691 图方块 end

    #include<iostream> int m,n; typedef struct node { int upx,upy; int dox,doy; int c; }node; node ...

  9. c/c++创建动态链接库

    extern "C" C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局 ...

  10. web之css伪类

    利用伪类清楚浮动: 代码: <!DOCTYPE html> <htmllang="en"> <head> <metacharset=&qu ...