0 基本原理
SMS: 短信 Short Message Service
Android将短信和彩信都存在 mmssms.db 中, 存放路径 : /data/data/com.android.providers.telephony/databases/mmssms.db , 真机上需要 root 后才能访问该文件。
1 表结构
Android通过 MmsSmsDatabaseHelper.java 来管理SMS 和 MMS,通过查看该类的代码,可以了解到具体的数据库表结构。
短信处理主要使用到表 sms ,编号为55的数据库版本创建sms表的语句如下(汉字注释是我增加的针对字段的说明,并非原代码中的内容):
注意: 数据库中的 INTEGER 对应到Java的 Long 类型。
2 相关 URI
我们不能直接读取 mmssms.db ,只能通过系统提供的 Content Provider来访问。
短信相关的URI有
最新的URI可以参见: SmsProvider.java
3 读取短信
3.1 获取短信列表
通常意义上的短信列表是指会话列表,就是同一联系人的短信记录只显示最近一条的那种显示方式。
通过URI地址 content://sms/conversations 可以获取短信的会话列表。但Android系统自带的查询结果只有三个字段。如:
- thread_id 会话编号
- msg_count 该会话中的短信条数
- snippet 该会话中最后一条短信的内容
一般而言,我们还需要在会话列表中显示联系人信息(姓名、头像、电话号码等) 和 最后一次收/发短信的时间。所以还需要对系统的返回结果进行扩充。
关键代码如下:
- “thread_id as _id” : 为了让查询结果可以传送给 CursorAdapter
- “sms.address as address” : 查询联系人号码
- “sms.date as date” : 查询最后一条短信的日期
- “sms.date desc” : 会话降序排序
3.2 获取短信的联系人
虽然sms表中有person字段,但如果是先接收到短信再将陌生人添加到联系人列表,则person仍然是为0。所以不能依赖 person 字段,只能通过 address 去查询联系人。
声明: 本文采用 CC BY-NC-SA 3.0 协议进行授权,转载请注明出处。