首页 > Android频道 > 【Android研究院之应用开发】 > Android研究院之应用程序短信库解析(十三)
2012
04-27

Android研究院之应用程序短信库解析(十三)

Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 1

今天我和同学们讨论一下Android平台下如何调用系统方法发送短信、接收短信、系统的短信库相关的问题。进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信。在Eclipse下打开DDMS

Incoming number: 这里须要填写的是发件人的手机号码,这里只能输入数字否则会无法发送。
Message: 这里为发送的内容
send: 上面两项都填写完毕点击发送键可以给模拟器发送短信。

Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 2

点击发送后,模拟器中就可以看到自己收到了一条消息 发件人的号码为123456 发送内容为hello。收到短信后会将这条信息写入系统的短信库,下面我们分析分析Android系统的短信库的结构。

Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 3

系统的短信库存在data/data/com.android.providers.telephony/databases/mmssms.db 下图蓝框中就是模拟器的短信库,我们将它打开看看里面存的是什么东东。

Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 4
打开mmssms.db  在打开sms表 因为所有短信数据都储存在这张表上,下面分析一下这张表的字段。
_id 不用说了吧,标示它的唯一性
thread_id :这个字段很重要,同一个会话中他们的thread_id是一样的,也就是说通过thread_id就可以知道A与B在聊天 还是 A与C在聊天
date :这条消息发送或接收的时间
read:  0 表示未读 1表示已读
type : 1表示接收 2 表示发出
body  表示 消息的内容
Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 5
我给12345回一条消息我们会看的更清楚这些节点的意义。
Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 6我们在看看thread_id指向的thread表
上图中可以清晰的看到 收到消息与回复消息的thread_id都为1 ,那么在thread_id这张表中
_id 不用说了吧,标示它的唯一性
date:表示最后接收或者发送消息的时间
message_count:表示发送消息的数量,这里我接收到了一条消息 也回复了一条消息那么它的数量就为2
recipient_ids:联系人ID,指向表 canonical_addresses 里的id。
snippet :最后收到或者发送的消息内容,就是上图body中存的东西

Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 7这么看来如果须要短信库中的数据就去访问数据库中的这两张表,sms表 uri 指向的是 “content://mms-sms/” thread表 uri指向的是”content://mms-sms/threadID” 具体访问的方法请看之前数据库的文章这里就不详细的说了。下面进入本章代码部分的正题,调用系统方法给联系人号码发送消息

Android研究院之应用程序短信库解析(十三) - 雨松MOMO程序研究院 - 8
    /**
* 参数说明
* destinationAddress:收信人的手机号码
* scAddress:发信人的手机号码
* text:发送信息的内容
* sentIntent:发送是否成功的回执,用于监听短信是否发送成功。
* DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。
*/
这里我主要说一下最后两个参数, SentIntent 这个intent用于接收这条信息自己发送成功还是自己发送失败, DeliveryIntent这个intent用于对方是否接受成功。 发送成功和接受成功是不一样的,发送只是把消息发到手机移动或联通运行商那里叫发送成功,至于以后怎么处理它不关心,只管发送是否成功。 而接受成功表示接受者是否将这条消息收到。


注册 接收成功 或者发送成功的广播

注册后 在BroadcaseRecevice中可以接收到发送 接收相关的广播

下面给出这个小例子的完整代码

一定要在AndroidManifest.xml中添加发送短信的权限噢。

发送完消息后打开手机的发信箱发现没有看到刚才发的消息,这是为什么呢? 是这样的。调用sendTextMessage 确实是发送消息 ,但是系统的短信库中没有这条消息 所以就看不到了。如果想要在系统的短信库中看到消息就必需把这条消息插到系统的短信库。

下面这段代码在发短信的同时也将短信内容写入系统库,这样在发件箱中就可以看到我们发送的短信了。

还是一定要在AndroidManifest.xml中添加相关的权限噢。

 

由于最近老熬夜写代码 身体实在是吃不消了,昨天同事带我去看中医  医生嘱咐我一定要好好休息不要熬夜了,开了很多中药。冷冻在公司冰箱里每天饭后20分钟喝一次 现在的中药还挺好喝嘎嘎,比我印象中小时候喝的好喝多了。 哇咔咔~~  看样子MOMO得好好养病了,希望早日生龙活虎。这里在此感谢关心我的朋友,同事,还有我的开发群里的好伙伴们。
老规矩每篇文章都会附带源代码,最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。


下载地址:http://vdisk.weibo.com/s/aa524

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 您好,,为什么我用你的方法。。在onReceive中的 switch (getResultCode()) 无论短信是否发送和接受成功都会返回 Activity.RESULT_OK??????????请赐教,不胜感激啊。。。