Q: 如何读取存放在手机里面的短信?
Q: 如何读取存放在手机里面的短信?
A: 其实我们首先需要知道一点的是,android使用SQLite数据库中。短信也是一样,保存在SQLite的数据库里面,但是我们并不能直接访问这个数据库,我们要通过Content Provider来进行访问。
首先我们看一下短信数据存放的位置,就在data/data/com.android.providers.telephony.databases.mmssms.db里面,这个地方存放着我们的短信和彩信数据。
我们把这个数据库导出来,点击中左边这个按钮,把它存到一个地方,然后我们就可以用SQLite打开这个文件来查看表的结构和里面的记录了。
我们可以看到,主要有下面的这些属性,其实大部分你可以猜出来的:
_id : 短消息ID
thread_id : 对话的序号
address : 发件人地址,也就是发给你的那个人的手机号码
person : 如果上面的手机号在你的联系人列表中存在的话,那么这个ID就是联系人的ID,否则是NULL
date : 发送或者接收的日期 long型
protocol : 彩信还是短信 0 短信 1 彩信
read : 是不是读过了 0 未读, 1 已读
status : 状态 -1接收,0 complete,64 pending, 128 failed
type : 发送还是接收的信息 1是接收到的,2是发出去的
body : 短消息内容
service_center : 短信服务中心号码编号
基本结构清楚了,我们就可以通过Provider来进行访问了。
这里需要注意的是,尽管我们知道数据库的准确地址,也知道是那个表,里面的字段也非常清楚,但是我们不需要直接访问,我们通过URI来进行访问。
短信收件箱对应的URI是content://sms/inbox
很简单吧,就是sms短信,然后inbox收件箱,类似,短信里面的URI分别是
content://sms/
content://sms/inbox
content://sms/sent
content://sms/draft
content://sms/outbox
content://sms/failed
content://sms/queued
接下来,我们就可以写一段代码读出所有的信息了,不过这个代码只用作演示,因为真的把所有的短信加到一起肯定会死机的。
主要操作其实就跟操作数据库一样,根据路径打开一个provider进行查询(Query),然后移动光标,对每次光标的移动进行操作,如取出字符串啊等等,最后关闭查询。
最后,我们要记得在我们的AndroidManifest.xml中注册premission
添加如下代码:
<uses-permissionandroid:name="android.permission.READ_SMS" />
参考网络资料:
http://hi.baidu.com/miuchen/blog/item/d5313b34bf35b887a61e1288.html
http://blog.csdn.net/madsky007/archive/2010/07/20/5750299.aspx
http://www.blogjava.net/easywu/archive/2010/02/19/313417.html