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

posted @ 2010-08-21 17:40  青龙  阅读(2317)  评论(0编辑  收藏  举报