读取短信和联系人经常会用到,要了解的是这是内容提供者(contentProvider)的知识点,大家都知道数据库是在data-->data 对应的包目录下,其他应用是不可以访问到的,如果有些数据要提供给其他的应用,比如通信录,其他应用想获取它的数据怎么办呢,这时内容提供者就出现了,预先写好了一些操作数据库的方法,因为方法是开发这个应用的开发者提供的,所以保证了数据库的安全操作,又能共享数据。

短信

开始切入正题,先说短信,要从数据库中获取数据,就要了解其结构

短信数据库在data-->data中的下面路径

它的表结构如下,有3个是我们要注意的,这3个是我们待会要用到的,其中date是毫秒值

Java代码为

     //获取内容提供者ContentResolver contentResolver = getContentResolver();//获取短信表的路径Uri uri = Uri.parse("content://sms");//设置要查询的列名String[] line = {"address", "date", "body"};//各个参数的意思,路径、列名、条件、条件参数、排序Cursor cursor = contentResolver.query(uri, line, null, null, null);//下面就跟操作普通数据库一样了if (cursor != null) {while (cursor.moveToNext()) {String address = cursor.getString(cursor.getColumnIndex("address"));String date = cursor.getString(cursor.getColumnIndex("date"));String body = cursor.getString(cursor.getColumnIndex("body"));Log.e("短信", "address:" + address + "\ndate:" + date + "\nbody:" + body);}cursor.close();}

联系人

获取联系人就比较复杂了,其表结构也比较复杂,我们获取联系人的姓名、电话号码、邮箱,要通过3张表去提取

数据库所在位置data-->data中的下面路径

data表,这个表中的“data1”列几乎包含了我们想要的数据,但是如何通过分类提取,第四列的代号说明了data1数据的类型,这些代号在mimetypes表中有对应的说明,要找到这些数据,又要通过raw_contact_id去查找,这些ID又来于raw_contacts表中

mimetypes表,对代号类型的说明

raw_contacts表,我们通信录中要显示的信息必须要在这里找到对应的ID,当我们删除了联系人,data表中的数据并没有删除,只是删除了证张表contact_id变为null,而不是真的删除

了解其表结构后,就开始写代码了

//获取内容提供者ContentResolver contentResolver = getContentResolver();//获取raw_contacts表的路径Uri raw_contact_uri = Uri.parse("content://com.android.contacts/raw_contacts");//各个参数的意思,路径、列名、条件、条件参数、排序Cursor contactId = contentResolver.query(raw_contact_uri, new String[]{"contact_id"}, null, null, null);//下面就跟操作普通数据库一样了if (contactId != null) {while (contactId.moveToNext()) {//获取contact_id的值,它对应data表中raw_contact_id的值String id = contactId.getString(contactId.getColumnIndex("contact_id"));//获取data表的路径Uri data_uri = Uri.parse("content://com.android.contacts/data");//各个参数的意思,路径、列名、条件、条件参数、排序Cursor dataCursor = contentResolver.query(data_uri, new String[]{"mimetype", "data1"},"raw_contact_id=?", new String[]{id}, null);if (dataCursor != null) {//每次循环创建一个实例用于保存data表中的数据ContactsData contactsData = new ContactsData();while (dataCursor.moveToNext()) {String type = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));switch (type) {case "vnd.android.cursor.item/email_v2"://这是邮箱信息contactsData.setEmail(dataCursor.getString(dataCursor.getColumnIndex("data1")));break;case "vnd.android.cursor.item/phone_v2"://这是手机号码信息contactsData.setNumber(dataCursor.getString(dataCursor.getColumnIndex("data1")));break;case "vnd.android.cursor.item/name"://这是联系人的名字contactsData.setName(dataCursor.getString(dataCursor.getColumnIndex("data1")));break;}}//把查询到的信息添加到集合中
                    contactsDatas.add(contactsData);dataCursor.close();}}contactId.close();}Log.d("测试","开始打印");for (ContactsData c : contactsDatas) {Log.e("联系人", c.toString());}

为了方便管理创建一个Javabean

public class ContactsData {private String email;private String number;private String name;public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "ContactsData{" +"email='" + email + '\'' +", number='" + number + '\'' +", name='" + name + '\'' +'}';}
}

最后别忘了加上权限

<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>

如过是Android 6.0以上的版本还要动态获取权限

获取联系人的效果图

真正应用

通常不会这样直接写它的路径的,因为手机厂商会修改它的路径,还是这样写的话会报错,说不存在这一列,需要使用Android提供的API

     /*** 通过ContactsContract.Contacts.CONTENT_URI来获取_ID和DISPLAY_NAME* _ID 该联系人的索引* 通过这个ID可以在ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中找到该联系人的电话号码* 通过这个ID可以在ContactsContract.CommonDataKinds.Email.CONTENT_URI 找到该联系人的邮箱* DISPLAY_NAME 是该联系人的姓名*/Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);if (cursor != null) {while (cursor.moveToNext()) {ContactsData contactsData = new ContactsData();//获取该联系人的IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));//该联系人的姓名String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));contactsData.setName(name);/*** 查找该联系人的phone信息* 在ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中查询* 条件为ContactsContract.CommonDataKinds.Phone.CONTACT_ID = 上面查询到的ID*/Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);if (phones != null && phones.moveToNext()) {//获取该联系人的手机号码String number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));contactsData.setNumber(number);phones.close();}/*** 查找该联系人的email信息* 在ContactsContract.CommonDataKinds.Email.CONTENT_URI 中查询* 条件为ContactsContract.CommonDataKinds.Phone.CONTACT_ID = 上面查询到的ID*/Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null);if (emails != null && emails.moveToNext()) {//获取该联系人的邮箱String email = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));contactsData.setEmail(email);emails.close();}contactsDatas.add(contactsData);}cursor.close();}Log.d("测试","开始打印");for (ContactsData c : contactsDatas) {Log.e("联系人", c.toString());}

看起来好像有点复杂,我们先看看下面的图片再去看代码,可能会容易理解,这些代码一共操作了3个表,严格来说是视图,在这3个表中获得他们共同的ID,根据ID在这3个表中分别提取对应的姓名、电话号码、邮箱

项目源代码:http://download.csdn.net/download/qq_33200967/9929430

转载于:https://www.cnblogs.com/yeyupiaoling/p/7286544.html

Android读取短信和联系人相关推荐

  1. androidの读取短信内容

    androidの读取短信内容 1. 读取短信内容,很简单,直接上代码 <span style="font-size:14px;"> public Uri SMS_INB ...

  2. Android 读取短信内容(模拟器)

    读取短信内容 读取短信的内容就要知道短信放在哪里,然后通过查询语句把结果封装到实体类的List中,再全部打印出来即可. 下面是具体的代码: activity_main.xml <?xml ver ...

  3. android 读取短信 彩信,Android 短信转换成彩信的消息数量(实例代码)

    默认3条以上转为彩信 改为5条 路径vendor/mediatek/proprietary/packages/apps/Mms/src/com/android/mms/MmsConfig.java p ...

  4. android 读取短信 彩信,Android系统中发送短信和彩信的代码

    发送短信: String body="this is sms demo"; Intent mmsintent = new Intent(Intent.ACTION_SENDTO, ...

  5. android读取短信内容简书,Android 获取App信息

    首先,来个简单的,获取本应用的信息 : //获取 build.gradle 中的 versionName 和 versionCode try { PackageInfo info = getPacka ...

  6. Android开发学习之电话、短信、联系人

    作为一部手机,最重要的功能当属电话.短信.联系人了,所以今天想和大家分享的是关于Android电话.短信.联系人这块的API接口. 1.通话记录的获取 List<TelePhoneRecord& ...

  7. 基于Android的短信应用开发(三)——读取手机短信

    在上一次的学习中,我们读取了手机联系人并将其显示在短信界面上,而接下来,我们将开始读取手机短信了,下面先来看一下最终运行效果图吧. 首先看一下手机短信数据库,访问路径是:/data/data/com. ...

  8. Android开发短信拦截与读取,消息通知Notification

    截获系统广播,读取消息,若联系人存在于通信录中,则让消息继续传播:若属于陌生号码,则中断消息,同时把信息显示在自己的程序中. 拦截器代码如下: public class SMSInterceptRec ...

  9. Android接收读取短信内容

    一.注册短信接收广播: public static final String SMS_BORADCAST = "android.provider.Telephony.SMS_RECEIVED ...

最新文章

  1. 库存系统难破题?京东到家来分享
  2. Dynamips 简介
  3. mysql semisync 恢复_mysql半同步复制(semi_sync_replication)搭建及使用
  4. 分布式事务(理论+实战)
  5. poj 3461 - Oulipo
  6. html隐藏微信举报菜单代码,微信开发-隐藏微信浏览器顶部菜单
  7. java 内存模型书籍_《深入理解 Java 内存模型》读书笔记
  8. 三次方程求根公式例子
  9. 语音外呼机器人邀请用户对营业厅评价
  10. Android生态系统进化论
  11. 【汇正财经】股本的法律规范
  12. HTML设置页面动画效果有几种,前端制作动画的几种方式(css3,js)
  13. 用伪造的TCP协议头花式欺骗核心转发设备?
  14. 软件测试培训之bug管理
  15. 海信将在柏林IFA推出屏幕发声激光电视
  16. 人民日报探店联想安定门店,联想智慧零售变革现成效
  17. python+selenium+webdriver 截取全页面长图
  18. 翻转180度后跳转页面 +轮播图 瀑布流+购物车
  19. 游戏特效贴图的制作与应用
  20. 【实用工具】鼠标连点器

热门文章

  1. mysql snmp agent_WebNMS SNMP Micro Agent for MySQL - MySQL Management Console
  2. 加载dict_PyTorch 7.保存和加载pytorch模型的两种方法
  3. 字体设置_Endnote教程|字体设置
  4. java map数组定义_如何定义一个空的Map[]数组?
  5. mysql lock scope_scope_lock模式详解
  6. poi 启用保护后取消_雪佛龙取消商标许可,澳洲加德士更名Ampol后启用新LOGO
  7. java 第9章_Java基础第9章.ppt
  8. java 俄语 工作_工作俄语怎么说
  9. react安装_「React实战」三分钟搭建React开发环境
  10. python leetcode_LeetCode刷题——第8天(python)