满足条件

1.手机root ,或者使用模拟器

2.使用monitor打开 FileExplorer 依次点击如入路径(短信数据库路径)

/data/data/com.Android.providers.telephony

3.Sqlite 数据库 查看软件

4.导出数据库到桌面,或者其他地方,使用sqlite进行查看

这里我们只关注 三张表

canonical_addresses,threads,Smss

canonical_addresses表结构代表的含义

id对应threads表里面的recipient_idsaddress对应sms表里面的address

数据库中sms 表 相关的字段如下:

_id                      primary key     integerwords表内的source_id关联thread_id              会话id,一个联系人的会话一个id,与threads表内的_id关联      integer address    对方号码          text  person     联系人id           integer    date       发件日期           integer  protocol     通信协议,判断是短信还是彩信    integer  0:SMS_RPOTO, 1:MMS_PROTOread         是否阅读           integer   default 0  0:未读, 1:已读    status      状态           integer   default-1。 -1:接收,0:complete,64: pending, 128failedtype         短信类型           integer 1:inbox  2:sent 3:draft 56  4:outbox  5:failed  6:queuedbody                      内容 service_center      服务中心号码 subject                  主题  reply_path_present  locked error_code seen

如果监听sms数据库变化,发送一条短信要经过type的6,4,2三个状态变化,如果只想监听接受到的短信内容

判断type=1即可,如果判断发送短信,判断type=2即可,这样就不会出现重复操作。

Threads表————这个相当于手机接收短信那个界面,是按联系人分的会话列表

Threads 表结构

接下来,需要了解一些基本的知识

ContentResolver

待续………

下面给出一些事例

从threads表获取日期,消息数量,部分消息内容,从sms表里面取得threads里_id对应的电话号码

 ContentResolver resolver = getContentResolver();              Cursor cursor = resolver.query(Uri.parse("content://mms-sms/conversations"),                       new String[]{ "* from threads--" },                       null,                       null,                       null);              System.out.println(cursor.getCount());              if(cursor.getCount()>0){                  while (cursor.moveToNext()) {                      MyMessageList messageList = new MyMessageList();                      messageList.setThreadid((cursor.getString(cursor.getColumnIndex("_id"))));                      SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd hh:mm");                      Date date = new Date(Long.parseLong(cursor.getString(cursor.getColumnIndex("date"))));                      String time = sfd.format(date);                      messageList.setDate(time);                      messageList.setMessagecount(cursor.getString(cursor.getColumnIndex("message_count")));                      messageList.setSnippet(cursor.getString(cursor.getColumnIndex("snippet")));                                   ContentResolver resolver2 = getContentResolver();                      Cursor cursor2 = resolver2.query(Uri.parse("content://sms/"),                               new String[]{"address"},                               "thread_id=?",                               new String[]{cursor.getString((cursor.getColumnIndex("_id")))},                              null);                          if(cursor2.moveToNext()){                              System.out.println(cursor2.getString(cursor2.getColumnIndex("address")));                              messageList.setPhone(cursor2.getString(cursor2.getColumnIndex("address")));                                           }                                         cursor2.close();                      myMessageLists.add(messageList);                  }                  System.out.println(myMessageLists.size());              }              cursor.close(); 

下面是从sms中获取具体的和某个人通话的短信

     ContentResolver resolver = getContentResolver();              Cursor cursor = resolver.query(Uri.parse("content://sms/"),                       new String[]{"date","body","type"},                       "thread_id=?",                       new String[]{threadidString},                      "date desc");                             if(cursor.getCount()>0){                  cursor.moveToFirst();                  System.out.println(cursor.getPosition());                  DetailMessage detailMessage = new DetailMessage();                  detailMessage.setMessageString(cursor.getString(cursor.getColumnIndex("body")));                  SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd hh:mm");                  Date date = new Date(Long.parseLong(cursor.getString(cursor.getColumnIndex("date"))));                  String time = sfd.format(date);                  System.out.println(time);  //              System.out.println(cursor.getString(cursor.getColumnIndex("date")));                  detailMessage.setDateString(time);                  detailMessage.setType(cursor.getInt(cursor.getColumnIndex("type")));                  arrayList.add(detailMessage);                  while (cursor.moveToNext()) {                      System.out.println(cursor.getPosition());                      detailMessage = new DetailMessage();                      detailMessage.setMessageString(cursor.getString(cursor.getColumnIndex("body")));                      date = new Date(Long.parseLong(cursor.getString(cursor.getColumnIndex("date"))));                      time = sfd.format(date);                      detailMessage.setDateString(time);                      detailMessage.setType(cursor.getInt(cursor.getColumnIndex("type")));                      arrayList.add(detailMessage);                                 }              }                                     cursor.close();   

引用
Sms table :http://blog.csdn.net/u013037007/article/details/37696401
totalTable :http://blog.csdn.net/u010335298/article/details/42778213

更多相关文章

  1. 赵雅智:Android短信发送器
  2. Android(安卓)获取未读短信(sms)数量
  3. Android(安卓)Contacts(二)—— SMS 短信 与 Contacts 联系人关联
  4. Android(安卓)---模拟手机发送短信
  5. Android(安卓)短信模块分析(二) MMS中四大组件核心功能详解
  6. android调用系统发短信传递电话号码和短信内容
  7. Android实现双模(CDMA/GSM)手机短信监听的方法
  8. Android(安卓)中短信数据库的简单操作
  9. 短信拦截与外拨电话拦截中的Action与权限

随机推荐

  1. OkHttp3实现原理
  2. Retrofit学习笔记(一)
  3. Android开发-HUAWEI DevEco Studio工具
  4. Android测试-Monkey Test
  5. Android(安卓)APP 中英文切换
  6. Android开发环境的配置与源代码的导入
  7. Android(安卓)Architecture(安卓架构)的一
  8. Android复习资料1
  9. android suspend and resume
  10. Android(安卓)分页控件制成底部菜单