内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者。

找到/data/data/com.android.providers.contacts/contacts2.db

这个目录下还有个文件contacts2.db.-journal,这个文件和数据库的事务相关

联系人应用数据库的主要结构

raw_contacts 联系人表 contact_id 联系人id

data数据表  raw_contact_id联系人id,mimetype_id数据类id,data1数据

mimetypes类型表 1 email,5 phone,7 name

查询所有的联系人信息:

  1. 查询raw_contacts表把联系人id取出来
  2. 根据id查询data表,把所有的数据取出来
  3. 根据数据的mimetype_id查询mimetypes表获取数据的业务类型

查询系统源代码,找到providers/Contacts相关的,先找清单文件,看到<Provider>节点,name属性和authories属性,主机名部分是分号隔开的contacts;com.android.contacts 低版本是前一个,高版本是后一个。

找到源码定义规则的地方UriMatcher对象的地方,看实际规则,一般是表名,因此实际Uri路径是 content://com.android.contacts/表名

获取ContentResolver对象,调用对象的query(uri)方法,参数:Uri就是路径

得到Cursor对象,循环Cursor对象

读取content://com.android.contacts/raw_contacts没问题

读取content://com.android.contacts/data 时出现错误,mimetype_id字段不存在,实际走的视图表,当你不确定字段的时候,调用Cursor对象的getColumnNames()方法,返回字段数组,打印一下

这里字段应该是data1和mimetype

调用Cursor对象的query()方法,注意写上条件,”raw_contact_id=?” 和值new String[]{id}

世面上的很多应用都是取出了联系人的信息,社交应用一般都有发送信息给对方,读取系统联系人

需要定义权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>

注意:如果一个账号被删除了,他不是真正的删除而是把raw_contacts表里面的contact_id写为null了,查询的时候应该加个判断是否为空!=null

activity:

        ContentResolver resolver=getContentResolver();
Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri=Uri.parse("content://com.android.contacts/data");
//循环联系人表
Cursor cursor=resolver.query(uri, null, null, null, null);
while(cursor.moveToNext()){
String id=cursor.getString(cursor.getColumnIndex("contact_id"));
//查找数据表
Cursor dataCursor=resolver.query(dataUri, null,"raw_contact_id=?", new String[]{id}, null);
while(dataCursor.moveToNext()){
String data1=dataCursor.getString(dataCursor.getColumnIndex("data1"));
String mimetype=dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
System.out.println("data1:"+data1+",mimetype:"+mimetype);
}
System.out.println("==========");
}

[android] 获取系统的联系人信息的更多相关文章

  1. Android 获取系统的联系人

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

  2. 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

    1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...

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

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

  4. C/C++通过WMI和系统API函数获取获取系统硬件配置信息

    转载:http://www.cnblogs.com/renyuan/archive/2012/12/29/2838716.html 转载:http://blog.csdn.net/jhqin/arti ...

  5. Android获取cpu和内存信息、网址的代码

      android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...

  6. System.getProperty()获取系统的配置信息

    原文地址:http://www.jsjtt.com/java/Javajichu/105.html 此处记录备用. 1. 通过System.getProperty()可以获取系统的配置信息,Syste ...

  7. iOS获取通讯录所有联系人信息

    以下是2种方式: 第一种方法: GetAddressBook.h #import <Foundation/Foundation.h> @interface GetAddressBook : ...

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

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

  9. System.getProperty()获取系统的配置信息(系统变量)

    原文地址:http://www.jsjtt.com/java/Javajichu/105.html 此处记录备用. 1. 通过System.getProperty()可以获取系统的配置信息,Syste ...

随机推荐

  1. idea 2017破解的三种方式

    1.该方法最为简便,但是该方法只可以在联网时使用,打开idea主页,找到最后面的Help,打开,找到register-license server, 在输入http://idea.iteblog.co ...

  2. eclipse 导入包含子maven项目的maven项目时的正确方式(父子项目)

    eclipse 导入包含子maven项目的maven项目时的正确方式(父子项目) NO1 导入时依次选择 import > Maven > Existing Maven Projects ...

  3. Python开发系列

    一  Python基础理论 Python简介 数据类型 字符编码与文件操作 函数 模块与包 常用模块 面向对象 网络编程 相关代码示例参考 https://github.com/Jonathan131 ...

  4. maven安装和四大特性

    一.安装配置maven 官网下载:http://maven.apache.org/download.html 1:解压后放在一个固定的位置 2:配置环境变量,具体如下 新建系统环境变量:MAVEN_H ...

  5. java 堆 栈 方法区的简单分析

    Java里的堆(heap)栈(stack)和方法区(method) 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创 ...

  6. 微信小程序的概要

    微信小程序的概要 学习小程序要了解一下什么事小程序,小程序开发前需要做哪些准备,微信小程序开发工具的使用,小程序中的目录结构解析,视图和渲染,事件. 小程序的配置详解,小程序的生命周期与app对象的使 ...

  7. dubbo实用知识点总结(二)

    1. 参数验证 2. 结果缓存 3. 泛化引用 客户端没有对应接口类的情况,可以直接调用 4. 泛化实现 5. 回声测试 用于检测服务是否可用 6. 上下文信息 7. 隐式传参(不常用) 8. 异步调 ...

  8. postgresql 日志配置

    Postgresql日志收集   PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_col ...

  9. 实现文件上传 你get了吗???

    实现文件上传: 1.jar包 需要用到两个jar包: commons-io.jar commons-fileupload.jar 下载地址:https://mvnrepository.com/ 2.f ...

  10. remote: Incorrect username or password ( access token )

    解决问题 进入控制面板 用户账号,选择管理您的凭据 修改凭据 修改完成后,保存即可