Android 获取系统的联系人
本文主要介绍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 获取系统的联系人的更多相关文章
- [android] 获取系统的联系人信息
内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者. 找到/data/data/com.android.providers.contacts/contacts2.db ...
- Android获取系统时间方法的总结
Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar ...
- Android 获取系统时间和网络时间
有些时候我们的应用中只能使用网络时间,而不能使用系统的时间,这是为了避免用户关闭了使用网络时间的功能后所产生的误差. 直接上代码. 1.清单文件中网络添加权限. <!-- 访问Internet资 ...
- android 获取系统联系人 完全解析
一.代码 1.ContactsEngine.java import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...
- android获取系统通讯录
package com.example.administrator.yunphone.View; import android.app.Fragment; import android.databas ...
- Android 获取系统短信内容
//这里通过内容提供者获取系统短信内容 Uri uri = Uri.parse("content://sms/"); String[] projection = {"_i ...
- Android 获取系统或SDCARD剩余空间信息(转)
android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd卡的大小和剩余空间,获取系统内部空间也就是/system的大小和剩余空间等等. 看下读取sd卡的:Java代码 ...
- Android 获取系统图库和相机照片 裁剪并显示
接上一篇 package com.example.image; import android.app.Activity; import android.content.Intent; import a ...
- android 获取系统硬件信息
一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ...
随机推荐
- 相同版本的CDH集群间迁移hdfs以及hbase
前言 由于项目数据安全的需要,这段时间看了下hadoop的distcp的命令使用,不断的纠结的问度娘,度娘告诉我的结果也让我很纠结,都是抄来抄去, 还好在牺牲大量的时间的基础上还终于搞出来了,顺便写这 ...
- 二维码详解(QR Code)
作者:王子旭链接:https://zhuanlan.zhihu.com/p/21463650来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 2016.7.5 更新:长文 ...
- 自己写的一个简单的jQuery提示插件
代码: /** * 2014年11月13日 * 提示插件 */ (function ($) { $.fn.tips = function (text) { var divtipsstyle = &qu ...
- iTextSharp快速使用指南
前言 最近公司一直使用iText开发PDF报表,使用一段时间之后发现iText这个类库虽然是庞大无比,但作为程序猿我们不需要知道所有的类和方法,我们只需要知道如何使用即可. 所以这篇文章就是告诉大家如 ...
- MySQL Workbench返回所有的记录
使用MySQL Workbench查询数据库,当返回的记录较多时,不能显示所有的记录,因为MySQL Workbench默认只返回1000条记录. 为了显示所有的记录,可以在查询语句后面加一句: LI ...
- 非常不错的Navigation Bar效果
非常不错的Navigation Bar效果,该源码转载于源码天堂的,大家可以了解一下吧,多视图应用程序中,我们常常使用到自定义UINavigationBar来完成导航条的设置. 源码我就不上传了,大家 ...
- tp5页面输出时,搜索后跳转下一页的处理
tp5页面输出时,搜索功能在跳转下一页时,如果不做任何处理,会返回原有是第二页输出的数据.为了保证跳转下一页时输出的是搜索到的数据,做以下处理. (要根据自己的搜索字段进行适当修改) 页面js代码,给 ...
- IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream
一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest { publ ...
- java多线程-线程创建
Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: ...
- Android应用开发基础之十一:新特性
Fragment 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity 定义布局文件作为Fra ...