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

找到/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. email program (客户端)演变过程有感

    以下内容全部为个人读后感(参考百度百科的相关资料) 首先我认为电子邮件是一个非常伟大的发明,它不仅成本低,而且传输效率快! 关于它的起源,我从百度百科中看到了两种说法     1.1969年10月世界 ...

  2. 【ZCTF】easy reverse 详解

    0x01  前言     团队逆向牛的解题思路,分享出来~ 0x02  内容 0. 样本 bbcdd1f7-9983-4bf4-9fde-7f77a6b947b4.dll 1. 静态分析 使用IDAP ...

  3. 3.CursorAdapter

    会话页面 点击菜单时编辑的按钮显示,其余的时候gone ConversationUI  public class ConversationUI extends Activity implements ...

  4. 教你一招用 IDE 编程提升效率的骚操作!

    阅读本文大概需要 3 分钟. IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码. 这个功能可以使用代码补全来模板式地补全语句,如遍历循环语句(for ...

  5. QMQ去哪儿网-mq中间件(启动失败)

    简介 去哪儿网近日宣布开源其内部广泛使用的消息中间件 QMQ .QMQ 自 2012 年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景: 也包括报价搜索等高吞吐量场景.目前在 ...

  6. Winginx nginx 启动提示80端口被占用

    第一步:查看80端口占用信息 win键+R运行命令:cmd-->netstat -aon|findstr "80" 2.结束任务 找到  pin=4272这个进程,将进程结束 ...

  7. 开源框架SpringMvc和Struts2的区别

    1.机制 spring mvc 和 struts2的加载机制不同:spring mvc的入口是servlet,而struts2是filter:(servlet和filter的区别?) 2.性能 spr ...

  8. GITHUB(github)初级使用

    Github顾名思义是一个Git版本库的托管服务,是目前全球最大的软件仓库,拥有上百万的开发者用户,也是软件开发和寻找资源的最佳途径,Github不仅可以托管各种Git版本仓库,还拥有了更美观的Web ...

  9. Kubernetes 笔记 03 扫清概念

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...

  10. HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

    HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的. 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明 ...