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" /> ...
随机推荐
- 报告一个IE很奇葩的滚动条问题——百分比计算宽度为浮点数时的滚动条显示异常
起因: 做项目的时候做了一个表格内容超过DIV容器自动横向滚动处理.别的浏览器都正常:但是在IE下面明明表格table和容器DIV宽度一致但是却出现了滚动条.如图 然后本人做实验找了半天原因终于是找到 ...
- VS2012连接到OSC@Git
osc终于全面开放git库了,这是我一直期待的事,也是促使我从CSDN转回OSC社区的重要原因之一.而这次我来教大家如何用osc@git来进行简单的版本控制.对于git,我自身也是近几周才开始学习,有 ...
- OpenStack虚拟云桌面在携程呼叫中心的应用
编者:本文为刘科在第六期[携程技术微分享]中的分享内容.在携程技术中心(微信号ctriptech)微信后台回复[云桌面],可加入微信交流群,和关注云桌面的小伙伴一起玩耍~ 刘科,携程系统研发云平台桌面 ...
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 上一篇介绍的基本的使用方式,虽然自由度很高,但是编写的代码相对还是挺多.于是框 ...
- Github的第三方验证
Github的第三方验证 随着近年来网络安全越来越受到重视,对于用户认证和用户信息保存模块的开发也提升到了一个新的高度. 一般小型网站开发的时候,由于技术水平和时间成本有限,很有可能会开发出一些或大或 ...
- wpf 自定义圆形按钮
wpf 自定义圆形按钮 效果图 默认样式 获取焦点样式 点击样式 下面是实现代码: 一个是自定义控件类,一个是控件类皮肤 using System; using System.Collections. ...
- GitHub上下载源代码的方法
GitHub上找到自己要下载的项目以后,有3种方法可以下载源代码. 第一种是复制该项目的地址,然后用其他软件下载: 第二种是安装了官方客户端,可以直接点击"Clone in Desktop& ...
- python 局部变量和全局变量 global
当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的.这称为变量的 作用域 .所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开 ...
- 自行实现PHP代码注解特性
PHP 注解 到目前为止,PHP的反射特性中是不支持注解Annotation的,但是可以支持基本的文档注释内容的获取 ReflectionMethod::getDocComment() - 从5.1. ...
- Appcelerator Titanium Studio: JNI_CreateJavaVM missing error
Mac升级到Yosemite后,Titanium Studio启动不了,报Appcelerator Studio: JNI_CreateJavaVM missing error 之类的错误,重装了Or ...