URI主要有:

content://sms/               所有短信
content://sms/inbox        收件箱
content://sms/sent          已发送
content://sms/draft         草稿
content://sms/outbox     发件箱
content://sms/failed       发送失败
content://sms/queued    待发送列表

sms主要结构:

  1. _id => 短消息序号 如100
  2. thread_id => 对话的序号 如100
  3. address => 发件人地址,手机号.如+8613811810000
  4. person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null
  5. date => 日期  long型。如1256539465022
  6. protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO
  7. read => 是否阅读 0未读, 1已读
  8. status => 状态 -1接收,0 complete, 64 pending, 128 failed
  9. type => 类型 1是接收到的,2是已发出
  10. body => 短消息内容
  11. service_center => 短信服务中心号码编号。如+8613800755500

String[] projection = new String[]{"address", "body"};
Cursor cursor = getContentResolver().query(uri, projection, "where .." new String[]{"", ""}, "order by ..")


Android短信存储数据库

偶然发现了Android源码中的一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mmssms.db中。

公开的SDK中没有这个类,不能直接使用。于是自己写了一个SQLiteOpenHelper,但是查询的时候发生SQL异常。看来不能为所欲为了,不过据网上资料介绍可以拷贝db文件来实现短信数据备份。

MmsSmsDatabaseHelper.java在Android源码中的路径:

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java


sms数据库中的字段如下:

_id               一个自增字段,从1开始
thread_id    序号,同一发信人的id相同
address      发件人手机号码
person        联系人列表里的序号,陌生人为null 
date            发件日期
protocol      协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO  
read           是否阅读 0未读, 1已读  
status         状态 -1接收,0 complete, 64 pending, 128 failed 
type     
    ALL    = 0;
    INBOX  = 1;
    SENT   = 2;
    DRAFT  = 3;
    OUTBOX = 4;
    FAILED = 5;
    QUEUED = 6;
 
body                     短信内容
service_center     短信服务中心号码编号
subject                  短信的主题
reply_path_present     TP-Reply-Path
locked


sms数据库表字段类型的源码:

[java]  view plain copy print ?
  1. private void createSmsTables(SQLiteDatabase db) {
  2. // N.B.: Whenever the columns here are changed, the columns in
  3. // {@ref MmsSmsProvider} must be changed to match.
  4. db.execSQL("CREATE TABLE sms (" +
  5. "_id INTEGER PRIMARY KEY," +
  6. "thread_id INTEGER," +
  7. "address TEXT," +
  8. "person INTEGER," +
  9. "date INTEGER," +
  10. "date_sent INTEGER DEFAULT 0," +
  11. "protocol INTEGER," +
  12. "read INTEGER DEFAULT 0," +
  13. "status INTEGER DEFAULT -1," + // a TP-Status value
  14. // or -1 if it
  15. // status hasn't
  16. // been received
  17. "type INTEGER," +
  18. "reply_path_present INTEGER," +
  19. "subject TEXT," +
  20. "body TEXT," +
  21. "service_center TEXT," +
  22. "locked INTEGER DEFAULT 0," +
  23. "error_code INTEGER DEFAULT 0," +
  24. "seen INTEGER DEFAULT 0" +
  25. ");");
  26. ....
  27. }

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java

联系人为空

短信数据库里面如果你是先受到陌生短信之后再把陌生人添加到联系人列表的话,短信数据库里面的person字段就为null,如果你是先添加联系人再发短 信的话,短信数据库里面的person字段就不为空了,所以你要是想通过短信数据库里的字段取得联系人的其他信息的话,只能通过地址来取。

实例:
  1. public String getSmsInPhone() {
  2. final String SMS_URI_ALL = "content://sms/";
  3. final String SMS_URI_INBOX = "content://sms/inbox";
  4. final String SMS_URI_SEND = "content://sms/sent";
  5. final String SMS_URI_DRAFT = "content://sms/draft";
  6. final String SMS_URI_OUTBOX = "content://sms/outbox";
  7. final String SMS_URI_FAILED = "content://sms/failed";
  8. final String SMS_URI_QUEUED = "content://sms/queued";
  9. StringBuilder smsBuilder = new StringBuilder();
  10. try {
  11. Uri uri = Uri.parse(SMS_URI_ALL);
  12. String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" };
  13. Cursor cur = getContentResolver().query(uri, projection, null, null, "date desc");      // 获取手机内部短信
  14. if (cur.moveToFirst()) {
  15. int index_Address = cur.getColumnIndex("address");
  16. int index_Person = cur.getColumnIndex("person");
  17. int index_Body = cur.getColumnIndex("body");
  18. int index_Date = cur.getColumnIndex("date");
  19. int index_Type = cur.getColumnIndex("type");
  20. do {
  21. String strAddress = cur.getString(index_Address);
  22. int intPerson = cur.getInt(index_Person);
  23. String strbody = cur.getString(index_Body);
  24. long longDate = cur.getLong(index_Date);
  25. int intType = cur.getInt(index_Type);
  26. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  27. Date d = new Date(longDate);
  28. String strDate = dateFormat.format(d);
  29. String strType = "";
  30. if (intType == 1) {
  31. strType = "接收";
  32. } else if (intType == 2) {
  33. strType = "发送";
  34. } else {
  35. strType = "null";
  36. }
  37. smsBuilder.append("[ ");
  38. smsBuilder.append(strAddress + ", ");
  39. smsBuilder.append(intPerson + ", ");
  40. smsBuilder.append(strbody + ", ");
  41. smsBuilder.append(strDate + ", ");
  42. smsBuilder.append(strType);
  43. smsBuilder.append(" ]\n\n");
  44. } while (cur.moveToNext());
  45. if (!cur.isClosed()) {
  46. cur.close();
  47. cur = null;
  48. }
  49. } else {
  50. smsBuilder.append("no result!");
  51. } // end if
  52. smsBuilder.append("getSmsInPhone has executed!");
  53. } catch (SQLiteException ex) {
  54. Log.d("SQLiteException in getSmsInPhone", ex.getMessage());
  55. }
  56. return smsBuilder.toString();
  57. }

转载于:https://my.oschina.net/tingzi/blog/103717

Android 短信解析相关推荐

  1. android 短信打开APP功能及注意事项

    android 短信打开APP 1.FirstActivity配置intent-filter 2.H5提供重定向 3.Activity解析参数 4.APP退到后台无法跳转问题解决 项目APP使用的是D ...

  2. Android 短信拦截及用途分析

    监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...

  3. Android短信的发送和广播接收者实现短信的监听

    Android短信的发送和广播接收者实现短信的监听  要注意Android清单中权限的设置以及广播的注册监听实现 以下就是 Android清单的XML AndroidManifest.xml < ...

  4. android短信功能裁剪,Android短信发送功能实现技巧分享

    如现在启动一模拟器id 号为5554,运行cmd telnet localhost 5554 输入help 可以看到很多用于模拟器中的功能命令 gsm call 134343434   // 便是呼叫 ...

  5. Android短信操作(通过内容提供者)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Android短信数据库表结构 URI主要有: content://sms/               所有短信 con ...

  6. Android短信发送流程之多收件人发送(原)

    前面的< Android短信发送流程之长短信发送 >中介绍了长短信对于普通短信的区别,而对于多收件人的情况,在SmsMessageSender的queueMessage()方法中我们了解到 ...

  7. Android短信发送流程之长短信发送(原)

    从前面< Android短信发送流程之普通短信发送 >流程看到,长短信与普通短信的流程从SmsManager的sendMultipartTextMessage()方法开始区分,现在我们来看 ...

  8. WCF 实例 —— Android 短信助手 (WCF + Android)

    (1)最近开始学习 Android,为了更快上手于是给自己找个小课题来练习一下: WCF作为服务端开放RESTful Service,Android作为客户端将手机上的短信传给服务端显示,并轮询服务端 ...

  9. android 手机短信恢复,Android短信如何恢复

    Android短信如何恢复?虽然当下微信使用非常普及,但不少重要事项还是会使用短信进行沟通的,比如快递密码箱ID提醒.信用卡还款提醒.验证码等.其目的是确保一定收到,不会因断网.未登陆等消息消失.所以 ...

最新文章

  1. 如何将自定义代码生成TVM
  2. 一个伟大、孤僻、特立独行的灵魂:天才已去60年
  3. C#对Excel的样式操作
  4. 华为云中国前二,全球前五,增速第一,凭什么?
  5. ASP:关于生成HTML文件的新闻系统
  6. java reference详解_Java Reference详解
  7. python应用于期货_Python期货量化交易基础教程(17)
  8. eclipse和idea代码通用吗_python能在苹果手机上运行吗
  9. 前端学习(3335):ant design中按钮尺寸的大小
  10. vue实现树形结构增删改查
  11. IS-IS详解(十九)——IS-IS 与IPv6
  12. 更改远程桌面默认端口3389及删除远程桌面连接历史记录
  13. cad2010多个文件并排显示_cad多窗口显示插件(docbar)
  14. EOF是什么意思以及怎么输入
  15. OA办公自动化系统作用
  16. 【Java】面向对象编程题
  17. 阿里20亿美金收购考拉,丁磊到底是怎么“失身”的?
  18. Sikerio --《只狼》
  19. 【英语:基础高阶_经典外刊阅读】L3.长句子扒皮—如何快速寻找主干
  20. 基于矩阵分解模型的协同过滤理论概述(涉及到SVD,SVD++,TimeSVD++)

热门文章

  1. uva 10285——Longest Run on a Snowboard
  2. linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题
  3. C++:String的写时拷贝
  4. 网络层网络层服务及其 IP 地址
  5. 内核的Makefile与Kconfig关系解析
  6. 从功能层次,阐述CPU、接口和外设之间的交互
  7. 如何化身BAT面试收割机?不吃透都对不起自己
  8. 腾讯,字节,阿里,小米,京东大厂Offer拿到手软!绝对干货
  9. gcc是java的什么意思_为什么gcc支持Java而不是C#
  10. matlab求解常微分方程组/传染病模型并绘制SIR曲线