一、拦截彩信
1、注册彩信接收器
彩信的拦截和网上百度或google出来的一样,都是注册一个广播接收器,然后把该接收器的权限设置成最大值,这个最大值不是网上说的1000而是2147483647(好像是整型的最大值)
在AdroidMainfest.xml里的代码如下:
-
-
<receiver
-
android:name=".app.MmsSmsReceiver">
-
<intent-filterandroid:priority="2147483647">
-
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
-
</intent-filter>
-
<intent-filterandroid:priority="2147483647">
-
<action
-
android:name="android.provider.Telephony.WAP_PUSH_RECEIVED"/>
-
<data
-
android:mimeType="application/vnd.wap.mms-message"/>
-
</intent-filter>
-
</receiver>
2、定义自己的广播接收处理类
和普通的广播接收一样,我们要自己写一个广播接收处理的类,但是要在onReceive方法里添加一句:abortBroadcast();这样在我们拦截到该条彩信信息后,当执行这一句时,该系统广播(就是接收到彩信的系统广播)就不在继续往下发送。
我的代码:
PS:部分方法可能不通用,自己按自己的情况来。
-
importcom.shanzha.activity.InvalidHeaderValueException;
-
importcom.shanzha.activity.MmsContent;
-
importcom.shanzha.activity.PduHeaders;
-
importcom.shanzha.activity.PduParser;
-
-
importandroid.content.BroadcastReceiver;
-
importandroid.content.Context;
-
importandroid.content.Intent;
-
-
publicclassMmsSmsReceiverextendsBroadcastReceiver{
-
-
-
-
publicstaticfinalStringSMS_RECEIVE_ACTION="android.provider.Telephony.SMS_RECEIVED";
-
-
-
-
publicstaticfinalStringMMS_RECEIVE_ACTION="android.provider.Telephony.WAP_PUSH_RECEIVED";
-
publicstaticlongdate=0;
-
Contextcontext;
-
byte[]TransactionId;
-
@Override
-
publicvoidonReceive(finalContextcontext,Intentintent){
-
-
this.context=context;
-
Stringaction=intent.getAction();
-
-
-
if(action.equals(MMS_RECEIVE_ACTION)){
-
PduParserparser=newPduParser();
-
-
try{
-
PduHeadersheaders=parser.parseHeaders(intent.getByteArrayExtra("data"));
-
TransactionId=headers.getTransactionId();
-
if(headers.getMessageType()==PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND){
-
-
Stringfrom=headers.getFrom();
-
finalStringcontent_location=headers.getContentLocation();
-
if(content_location!=null){
-
newThread(){
-
publicvoidrun(){
-
MmsConnectmmsConnect=newMmsContent(context,content_location,TransactionId);
-
try{
-
mmsConnect.connect();
-
}catch(Exceptione){
-
-
e.printStackTrace();}
-
}
-
}.start();
-
-
}
-
-
}
-
-
}catch(InvalidHeaderValueExceptione){
-
-
e.printStackTrace();}
-
-
abortBroadcast();
-
}
-
}
-
-
}
3、彩信内容的获取与解析(重点和难点,pdu的解析)
其实在第二步我们能获得的仅仅是一个号码(发送者的号码)和一个url(彩信内容下载地址)地址(需要扣取系统的源码来解析彩信信息)以及每条彩信的标识id,我们可以根据号码选择是不是把该条彩信屏蔽(当然还可以进行其他操作)。如果需要获取彩信内容,就需要从我们获得url地址下载彩信信息主体,下载获得的数据是byte[]类型的,需要转换才能成为可用数据(这一块是重点,详情参考系统源码)。
我的关键代码:
彩信数据(内容)下载:
-
protectedbyte[]getPdu(Stringurl)throwsIOException{
-
-
returnHttpUtils.httpConnection(
-
context,-1L,
-
url,null,HttpUtils.HTTP_GET_METHOD,
-
true,
-
"10.0.0.172",
-
80);
-
}
彩信数据解析:
-
-
mmsData=getPdu(contentLocation);
-
-
-
PduBodybody=null;
-
GenericPdupdu=newPduParser(mmsData).parse();
-
if((pdu==null)||(pdu.getMessageType()!=0x84)){
-
-
Log.e("xml","数据为空或类型错误");
-
}elseif(pduinstanceofMultimediaMessagePdu){
-
body=((MultimediaMessagePdu)pdu).getBody();
-
-
-
Stringsubject=((MultimediaMessagePdu)pdu).getSubject().getString();
-
if(body!=null){
-
intpartsNum=body.getPartsNum();
-
for(inti=0;i<partsNum;i++){
-
PduPartpart=body.getPart(i);
-
-
-
StringcontentType=newString(part.getContentType(),"gb2312");
-
-
-
if(contentType.contains("text")){
-
-
-
Stringcontent=newEncodedStringValue(part.getData()).getString();
-
-
MMs_Content.put("text",part.getData());}
-
-
elseif(contentType.contains("jpeg")){
-
-
-
Bitmapbmp=BitmapFactory.decodeByteArray(part.getData(),0,part.getData().length);
-
if(bmp!=null){
-
-
MMs_Content.put("jpeg",part.getData());
-
}else
-
Log.i("xml","Bitmapisnull");
-
-
}else{
-
-
}
-
}
-
}
-
}
4、向彩信中心返回成功状态信息。
当我们成功下载数据后要向向彩信中心返回成功的状态(第三步解析获得的彩信id),彩信中心才认为我们成功接收到彩信。
-
-
NotifyRespIndnotifyRespInd=newNotifyRespInd(
-
PduHeaders.CURRENT_MMS_VERSION,
-
TransactionId,PduHeaders.STATUS_RETRIEVED);
-
-
mHttpBox=newHttpBox(MMSC,newPduComposer(context,notifyRespInd).make());
-
-
mHttpBox.setConnectTimeout(50*1000);
-
mHttpBox.setReadTimeout(30*1000);
-
mHttpBox.setRequestMethod(true);
-
-
mHttpBox.addHeader("User-Agent","Nokia6120c/4.21(SymbianOS/9.2;U;Series60/3.1Nokia6120c/4.21;Profile/MIDP-2.0Configuration/CLDC-1.1)Mozilla/5.0AppleWebK");
-
mHttpBox.addHeader("Accept","*/*,application/vnd.wap.mms-message,application/vnd.wap.sic");
-
mHttpBox.addHeader("Content-Type","application/vnd.wap.mms-message");
-
mHttpBox.addHeader("Accept-Charset","iso-8859-1,utf-8;q=0.7,*;q=0.7");
-
mHttpBox.addHeader("Accept-Language","zh-cn,zh;q=1.0,en;q=0.5");
-
-
mHttpBox.connect();
-
-
-
二、发送彩信
这部分相对而言没有那么复杂,难点是pdu的组包,很多问题都是由组包不正确引起的,另外需要注意的一点是:要注意APN的切换,这样才能提高发送成功的成功率。这一部分的资料相对很多啊,我就不贴代码了。注意我开篇说的问题就行了,自己多试一下吧。
这里提供一篇作为参考的文章,我就是根据这篇文章实现的彩信发送,但是同样要注意我开篇说的问题哦。
彩信发送参考:http://blog.csdn.net/aniuaniuaniuaniu/article/details/7225967
分享到:
相关推荐
该资源主要实现了短信以及彩信的拦截,并且让拦截后的短信和彩信存储在自己定义的数据库中,而且有短信的互动,也就是收发短信的功能,同事实现了彩信和短信的显示,不足之处在于接受彩信时,一定要开启数据流量,...
最简单的android彩信发送代码。适合学习彩信发送流程。 事实上android中的Mms模块中,对这个流程进行了很少的封装,这里就是将其简化,帮助初学者了解流程。
本资源实现了android系统中短信的拦截和显示、彩信的拦截及保存 短信的发送功能,将所有的拦截的彩信数据都存储在自己建立的数据库中。
5)人工审核发送功能,系统可以设置用户是否需要审核发送,超过起始号码数的会自动拦截,并短信提醒管理员客户已提交群发短信,由管理员通过系统自动发送或通过卡发设备(短信猫)发送。 6)智能白名单功能,管理员...
4、 修改在默认拦截模式下,白名单与名片夹优先于地区拦截。 5、 美化管家12宫格界面。 6、 优化完善安全管家的操作流程 安全管家1.91版目前有以下几个主要功能: 信息来电防火墙(包括黑白名单管理、拦截记录、...
针对来电的过滤,提供返回忙音,关闭铃声,忙音并发送短信,返回空号,返回已关机,自定义呼叫转移六种拦截模式(返回空号,返回已关机,自定义呼叫转移需要用户SIM卡支持),能让用户自如把握个人时间; 6.在正常...
针对来电的过滤,提供返回忙音,关闭铃声,忙音并发送短信,返回空号,返回已关机,自定义呼叫转移六种拦截模式(返回空号,返回已关机,自定义呼叫转移需要用户SIM卡支持),能让用户自如把握个人时间; 6.在正常...
针对来电的过滤,提供返回忙音,关闭铃声,忙音并发送短信,返回空号,返回已关机,自定义呼叫转移六种拦截模式(返回空号,返回已关机,自定义呼叫转移需要用户SIM卡支持),能让用户自如把握个人时间; 6.在正常...
【超越彩信】超越彩信(文件格式,文件大小的限制)的互联网短信,语音、图片、视频、文件无所不能 Youni安全、省心的互联网短信: 【安全备份】通讯录&短信备份到云端,永不丢失 【消息拦截】智能拦截垃圾短信,...
据说是拦截彩信,并解析内容。这个还没有动手实践过。 优点:实现简单。实时性也好。 缺点:SMS服务的成本问题。贵! 3、TCP/IP,持久的长连接。简单的说就是与服务器建立一个基于TCP/IP持久连