彩信的拦截与发送
前段时间(已经过去两个月了....)公司让搞一下android彩信的拦截与发送,于是就在网上找了一些资料,开始研究它的实现过程。
PS:需要从系统源码中扣取部分文件,大概在30个左右,不知道能不能精简,没认真看过。这里我重点说一下彩信的拦截和解析,因为彩信解析方面的资料相对较少。发送的部分我会提供一下我的参考文章,并且可能会转载一下这篇文章,我就是通过这篇文章实现的彩信发送。
因为代码量比较大,所以就只贴下关键源码,并且说下流程和要注意的问题。仔细搜索一下的话网上可以找到相关的demo和资料(主要是彩信发送方面的,解析的好像没有),但是在使用时要注意,他们说的并不是全对的,某些方面给你误导了,他们的整体流程和源码都是好的,但是在一些点上刻意写错了(主要是pdu组包、图片或附件的类型等)。
简要说一下我的流程吧:
一、拦截彩信
1、注册彩信接收器
彩信的拦截和网上百度或google 出来的一样,都是注册一个广播接收器,然后把该接收器的权限设置成最大值,这个最大值不是网上说的1000而是2147483647(好像是整型的最大值)
在AdroidMainfest.xml里的代码如下:
2、定义自己的广播接收处理类
和普通的广播接收一样,我们要自己写一个广播接收处理的类,但是要在onReceive方法里添加一句:abortBroadcast();这样在我们拦截到该条彩信信息后,当执行这一句时,该系统广播(就是接收到彩信的系统广播)就不在继续往下发送。
我的代码:
PS:部分方法可能不通用,自己按自己的情况来。
3、彩信内容的获取与解析 (重点和难点,pdu的解析)
其实在第二步我们能获得的仅仅是一个号码(发送者的号码)和一个url(彩信内容下载地址)地址(需要扣取系统的源码来解析彩信信息)以及每条彩信的标识id,我们可以根据号码选择是不是把该条彩信屏蔽(当然还可以进行其他操作)。如果需要获取彩信内容,就需要从我们获得url地址下载彩信信息主体,下载获得的数据是byte[]类型的,需要转换才能成为可用数据(这一块是重点,详情参考系统源码)。
我的关键代码:
彩信数据(内容)下载:
彩信数据解析:
4、向彩信中心返回成功状态信息。
当我们成功下载数据后要向向彩信中心返回成功的状态(第三步解析获得的彩信id),彩信中心才认为我们成功接收到彩信。
二、发送彩信
这部分相对而言没有那么复杂,难点是pdu的组包,很多问题都是由组包不正确引起的,另外需要注意的一点是:要注意APN的切换,这样才能提高发送成功的成功率。这一部分的资料相对很多啊,我就不贴代码了。注意我开篇说的问题就行了,自己多试一下吧。
这里提供一篇作为参考的文章,我就是根据这篇文章实现的彩信发送,但是同样要注意我开篇说的问题哦。
彩信发送参考:http://blog.csdn.net/aniuaniuaniuaniu/article/details/7225967