一、代码

1.ContactsEngine.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;

public class ContactsEngine {
	/**
	 * 获取系统联系人
	 *
	 * @return
	 */
	public static List<HashMap<String, String>> getAllContacts(Context context) {
		List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
		// 1.获取内容解析者
		ContentResolver resolver = context.getContentResolver();
		// 2.内容提供者地址 com.android.contacts  例如百度搜索jdk:www.baidu.com/jdk
		// raw_contacts表地址:raw_contacts  veiw_data表的地址:data
		// 3.生成查询地址
		Uri raw_uri = Uri.parse("content://com.android.contacts/raw_contacts");// http://
		Uri data_uri = Uri.parse("content://com.android.contacts/data");
		// 4.查询数据,先查询raw_contacts的contact_id
		// projection:查询的字段
		Cursor cursor = resolver.query(raw_uri, new String[] { "contact_id" },
				null, null, null);
		// 5.解析cursor
		while (cursor.moveToNext()) {
			// columnIndex : 表示字段的索引
			String contact_id = cursor.getString(0);
			// cursor.getString(cursor.getColumnIndex("contact_id"));//getColumnIndex
			// : 获取字段在cursor的索引,一般用在查询字段比较多的情况
			if (contact_id != null) {
				// 6.根据contact_id去查询veiw_data表, 报空指针异常的2种情况:null.方法、参数为空
				Cursor c = resolver.query(data_uri, new String[] { "data1",
						"mimetype" }, "raw_contact_id=?",
						new String[] { contact_id }, null);
				HashMap<String, String> map = new HashMap<String, String>();
				// 7.解析c
				while (c.moveToNext()) {
					// 获取数据
					String data1 = c.getString(0);
					String mimetype = c.getString(1);
					// 8.根据mimetype判断data1的类型
					if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {
						// 电话
						// 9.保存数据
						map.put("phone", data1);
					} else if (mimetype.equals("vnd.android.cursor.item/name")) {
						// 姓名
						map.put("name", data1);
					}
				}
				// 10.添加到集合中
				list.add(map);
				// 11.关闭cursor
				c.close();
			}
		}
		cursor.close();
		return list;
	}
}

2.需要添加权限

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

二、单元测试

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

TestContacts.java

import java.util.HashMap;
import java.util.List;

import com.demo.engine.ContactsEngine;

import android.test.AndroidTestCase;

public class TestContacts extends AndroidTestCase {
	public void testContacts(){
		List<HashMap<String, String>> list = ContactsEngine.getAllContacts(getContext());
		for (HashMap<String, String> hashMap : list) {
			System.out.println("姓名:"+hashMap.get("name")+"   电话:"+hashMap.get("phone"));
		}
	}
}

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. mongodb 分组查询

    数据的保存 include_once 'mDB.class.php'; $m=new mDB(); $m->setDB('mydb'); // $m->save('stu',['dept' ...

  2. Python自动化 【第十五篇】:CSS、JavaScript 和 Dom介绍

    本节内容 CSS javascript dom CSS position标签 fixed: 固定在页面的某个位置 relative + absolute: 相对定位 opacity:0.5 设置透明度 ...

  3. java性能调优工具

    windows调优工具: 任务管理器(ctrl+alt+delete或).资源管理器(任务管理器->性能进入或运行resmon.exe):JVM分析工具Jconsole,jProfile,Vis ...

  4. mysql快速导入大量数据问题

    今天需要把将近存有一千万条记录的*.sql导入到mysql中.使用navicate导入,在导入100万条之后速度就明显变慢了, 导入五百万条数据的时候用了14个小时,且后面的数据导入的越来越慢. 后来 ...

  5. android 简单打jar包

    先建议一个moduel,先写一个下载图片代码: public class LoadTest extends AsyncTask<Void,Void,byte[]>{ public stat ...

  6. sql语句_分页查询

    1.查询数据库中存在某一列名的表 use [db] go SELECT name FROM sysobjects WHERE id IN (SELECT id FROM syscolumns WHER ...

  7. make[2]: *** No rule to make target `/root/.pyenv/versions/anaconda3-2.4.0/lib/libpython3.5m.so', needed by `evaluation.so'. Stop.

    当出现No rule to make target ,肯定是Makefile有问题. 有的makefile是脚本生成的,你得看脚本的配置文件对不对. 我的是这个脚本生成的.发现是Pythondir的配 ...

  8. sqlserver存取过程游标

    ALTER proc [dbo].[common_proc_temp2] as begin declare @id varchar(50); declare @cbcontractid varchar ...

  9. cenos 7常用操作

    centos 虚拟机 <一>设置ip <1>虚拟机配置ip 虚拟机->设置->网络适配器->设置NAT模式 <2>编辑->虚拟网络编辑器,对 ...

  10. iOS中UITableView使用总结

    链接:http://www.open-open.com/lib/view/open1430008922468.html