本文主要介绍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区分数据的类型

接下来通过代码实现

package com.wuyudong.getcontacts;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
* 获取全部的联系人
*
* @param view
*/
public void click(View view) {
ContentResolver resolver = getContentResolver();
// 1.查询raw_contacts表,把联系人的id取出来
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
System.out.println("联系人id: " + id);
// 2.根据联系人的id,查询data表,把这个id的数据取出来
// 系统api查询data表的时候不是真正的查询的data表,而是查询data表的视图
Cursor dataCursor = resolver.query(datauri, new String[] { "data1", "mimetype" },
"raw_contact_id=?", new String[] { id }, null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
System.out.println("data1=" + data1);
String mimetype = dataCursor.getString(1);
System.out.println("mimetype=" + mimetype);
}
dataCursor.close();
}
cursor.close(); } }

添加权限: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

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

package com.wuyudong.getcontacts;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
* 获取全部的联系人
*
* @param view
*/
public void click(View view) {
ContentResolver resolver = getContentResolver();
// 1.查询raw_contacts表,把联系人的id取出来
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
System.out.println("联系人id: " + id);
// 2.根据联系人的id,查询data表,把这个id的数据取出来
// 系统api查询data表的时候不是真正的查询的data表,而是查询data表的视图
Cursor dataCursor = resolver
.query(datauri, new String[] { "data1", "mimetype" },
"raw_contact_id=?", new String[] { id }, null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0); String mimetype = dataCursor.getString(1);
if ("vnd.android.cursor.item/name".equals(mimetype)) {
System.out.println("姓名=" + data1);
} else if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {
System.out.println("邮箱=" + data1);
} else if ("vnd.android.cursor.item/phone_v2".equals(data1)) {
System.out.println("电话=" + data1);
} else if ("vnd.android.cursor.item/im".equals(mimetype)) {
System.out.println("QQ=" + data1);
}
}
dataCursor.close();
}
cursor.close(); } }

运行后打印相关的结果:

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文件

package com.wuyudong.getcontacts.service;

import java.util.ArrayList;
import java.util.List; import com.wuyudong.getcontacts.domain.ContactInfo; import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri; public class ContactInfoParser {
/**
* 获取系统全部联系人的api方法
*
* @param context
* @return
*/
public static List<ContactInfo> findAll(Context context) {
ContentResolver resolver = context.getContentResolver();
// 1.查询raw_contacts表,把联系人的id取出来
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
List<ContactInfo> infos = new ArrayList<ContactInfo>();
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
if (id != null) {
System.out.println("联系人id: " + id);
ContactInfo info = new ContactInfo();
info.setId(id);
// 2.根据联系人的id,查询data表,把这个id的数据取出来
// 系统api查询data表的时候不是真正的查询的data表,而是查询data表的视图
Cursor dataCursor = resolver.query(datauri, new String[] {
"data1", "mimetype" }, "raw_contact_id=?",
new String[] { id }, null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
if ("vnd.android.cursor.item/name".equals(mimetype)) {
System.out.println("姓名=" + data1);
info.setName(data1); } else if ("vnd.android.cursor.item/email_v2"
.equals(mimetype)) {
System.out.println("邮箱=" + data1);
info.setEmail(data1);
} else if ("vnd.android.cursor.item/phone_v2".equals(data1)) {
System.out.println("电话=" + data1);
info.setPhone(data1);
} else if ("vnd.android.cursor.item/im".equals(mimetype)) {
System.out.println("QQ=" + data1);
info.setQq(data1);
} }
infos.add(info);
System.out.println("-------");
dataCursor.close();
}
}
cursor.close();
return infos; } }

新建ContactInfo.java

package com.wuyudong.getcontacts.domain;

public class ContactInfo {

    private String name;
private String id;
private String phone;
private String email;
private String qq; @Override
public String toString() {
return "ContactInfo [name=" + name + ", id=" + id + ", phone=" + phone
+ ", email=" + email + ", qq=" + qq + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
} }

最后调用相关api

package com.wuyudong.getcontacts;

import java.util.List;

import com.wuyudong.getcontacts.domain.ContactInfo;
import com.wuyudong.getcontacts.service.ContactInfoParser; import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
* 获取全部的联系人
*
* @param view
*/
public void click(View view) {
List<ContactInfo> infos = ContactInfoParser.findAll(this);
for (ContactInfo info : infos) {
System.out.println(info.toString());
} } }

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. SQL Server 2014如何提升非在线的在线操作

    在今天的文章里,我想谈下在线索引重建操作( Online Index Rebuild operations),它们在SQL Server 2014里有怎样的提升.我们都知道,自SQL Server 2 ...

  2. 【C#进阶系列】12 泛型

    泛型是CLR和编程语言提供的一种特殊机制,它用于满足“算法重用”  . 可以想象一下一个只有操作的参数的数据类型不同的策略模式,完全可以用泛型来化为一个函数. 以下是它的优势: 类型安全 给泛型算法应 ...

  3. 对状态空间图搜索的几种算法比较(图)【深度、宽度、动态规划(均一代价)、最佳优先和A*算法】

    ---------------------------------------------------------------------------------------------------- ...

  4. Android版的菜谱客户端应用源码完整版

    Android版的菜谱客户端应用源码完整版,这个文章是从安卓教程网转载过来的,不是本人的原创,希望能够帮到大家的学习吧. <ignore_js_op> 152936qc7jdnv6vo0c ...

  5. PHP程序员7小时学会Kotlin系列 - 第一小时 背景

    基础知识 Kotlin简单的说是Java语言的改良版本,是一种静态类型编程语言,可运行于JVM.Andoid或JavaScript环境,于2016年2月15日发布1.0正式版.Kotlin定位于一门通 ...

  6. springmvc(2)Controller源码简单解析

    前面简单的分析了一下DispatcherServlet,接下来分析一下Controller,在web的MVC中,Controller就是其中的C,启动的一些页面逻辑处理,页面映射的功能: 首先看看超类 ...

  7. 高频sql语句汇总。不断更新。。

    操作 语句 创建数据库 CREATE DATABASE dbname/* DEFAULT CHARSET utf8 COLLATE utf8_general_ci;*/ 删除数据库 DROP DATA ...

  8. Spring之AntPathMatcher

    前言 AntPathMatcher是什么?主要用来解决什么问题? 背景:在做uri匹配规则发现这个类,根据源码对该类进行分析,它主要用来做类URLs字符串匹配: 效果 可以做URLs匹配,规则如下 ? ...

  9. 编译安装php-amq扩展

    用途:这个扩展是用来操作rabbitmq服务端的 一.安装总括 1.编译安装librabbitmq库 这是一个开源c语言的库.用来与rabbitmq进行通信 而php的php-amqp扩展就是使用这个 ...

  10. mysql出错:Access denied for user 'root'@'localhost' (using password: YES)

    网站链接mysql数据库的时候,连接不上,并报出错误:Access denied for user 'root'@'localhost' (using password:YES) 这是个相当恼火的问题 ...