彩信的拦截与发送

一、拦截彩信

     1、注册彩信接收器

           彩信的拦截和网上百度或google 出来的一样,都是注册一个广播接收器,然后把该接收器的权限设置成最大值,这个最大值不是网上说的1000而是2147483647(好像是整型的最大值)

   在AdroidMainfest.xml里的代码如下:

[html]  view plain copy print ?
  1. <!-- MMS SMS接收器 -->  
  2.         <receiver  
  3.             android:name=".app.MmsSmsReceiver">  
  4.             <intent-filter android:priority="2147483647">  
  5.                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  6.             </intent-filter>  
  7.             <intent-filter android:priority="2147483647">  
  8.                 <action  
  9.                     android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />  
  10.                 <data  
  11.                     android:mimeType="application/vnd.wap.mms-message" />  
  12.             </intent-filter>  
  13.         </receiver>  

        2、定义自己的广播接收处理类

            和普通的广播接收一样,我们要自己写一个广播接收处理的类,但是要在onReceive方法里添加一句:abortBroadcast();这样在我们拦截到该条彩信信息后,当执行这一句时,该系统广播(就是接收到彩信的系统广播)就不在继续往下发送。

          我的代码:

PS:部分方法可能不通用,自己按自己的情况来。

[java]  view plain copy print ?
  1. import com.shanzha.activity.InvalidHeaderValueException;  
  2. import com.shanzha.activity.MmsContent;  
  3. import com.shanzha.activity.PduHeaders;  
  4. import com.shanzha.activity.PduParser;  
  5.   
  6. import android.content.BroadcastReceiver;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9.   
  10. public class MmsSmsReceiver extends BroadcastReceiver {  
  11.     /** 
  12.      * 接收短信 
  13.      */  
  14.     public static final String  SMS_RECEIVE_ACTION = "android.provider.Telephony.SMS_RECEIVED";   
  15.     /** 
  16.      * 接收彩信 
  17.      */  
  18.     public static final String  MMS_RECEIVE_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";  
  19.     public static long date = 0;  
  20.      Context context;  
  21.      byte[] TransactionId;  
  22.     @Override  
  23.     public void onReceive(final Context context, Intent intent) {  
  24.         // TODO Auto-generated method stub  
  25.         this.context=context;  
  26.         String action = intent.getAction();  
  27.           
  28.         //彩信  
  29.         if(action.equals(MMS_RECEIVE_ACTION)){  
  30.         PduParser parser = new PduParser();  
  31.   
  32.         try {  
  33.              PduHeaders headers = parser.parseHeaders(intent.getByteArrayExtra("data"));  
  34.              TransactionId = headers.getTransactionId();  
  35.              if (headers.getMessageType() == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) {  
  36.             //号码获取  
  37.             String from = headers.getFrom();                          
  38.             final String content_location = headers.getContentLocation();  
  39.             if (content_location != null) {  
  40.                  new Thread() {  
  41.                 public void run() {  
  42.                 MmsConnect mmsConnect = new MmsContent(context,content_location,TransactionId);  
  43.                  try {  
  44.                       mmsConnect.connect();  
  45.                      } catch (Exception e) {  
  46.                     // TODO Auto-generated catch block  
  47.                     e.printStackTrace();}  
  48.                                          }  
  49.                   }.start();  
  50.   
  51.             }  
  52.                           
  53.              }  
  54.       
  55.         } catch (InvalidHeaderValueException e) {  
  56.                 // TODO Auto-generated catch block  
  57.                 e.printStackTrace();}  
  58.                   //广播不在发送  
  59.         abortBroadcast();  
  60.         }  
  61.     }  
  62.   
  63. }  

        3、彩信内容的获取与解析 (重点和难点,pdu的解析)

              其实在第二步我们能获得的仅仅是一个号码(发送者的号码)和一个url(彩信内容下载地址)地址(需要扣取系统的源码来解析彩信信息)以及每条彩信的标识id,我们可以根据号码选择是不是把该条彩信屏蔽(当然还可以进行其他操作)。如果需要获取彩信内容,就需要从我们获得url地址下载彩信信息主体,下载获得的数据是byte[]类型的,需要转换才能成为可用数据(这一块是重点,详情参考系统源码)。

             我的关键代码:

 彩信数据(内容)下载:          

[java]  view plain copy print ?
  1. protected byte[] getPdu(String url) throws IOException {  
  2.         //    ensureRouteToHost(url, mTransactionSettings);  
  3.             return HttpUtils.httpConnection(  
  4.                     context, -1L,  
  5.                     url, null, HttpUtils.HTTP_GET_METHOD,  
  6.                     true,  
  7.                    "10.0.0.172",  
  8.                     80);  
  9.         }  

彩信数据解析:

[java]  view plain copy print ?
  1.                 //下载彩信数据  
  2. mmsData=getPdu(contentLocation);  
  3.       
  4. //彩信数据解析  
  5. PduBody body = null;  
  6. GenericPdu pdu = new PduParser(mmsData).parse();  
  7. if ((pdu == null) || (pdu.getMessageType() != 0x84)) {  
  8.           
  9.                         Log.e("xml""数据为空或类型错误");  
  10.                 }else if (pdu instanceof MultimediaMessagePdu) {  
  11.            body = ((MultimediaMessagePdu) pdu).getBody();  
  12.              
  13.            //获取主题  
  14.            String subject=((MultimediaMessagePdu) pdu).getSubject().getString();  
  15.  if (body != null) {  
  16.                int partsNum = body.getPartsNum();  
  17.                for (int i = 0; i < partsNum; i++) {  
  18.                    PduPart part = body.getPart(i);  
  19.                      
  20.                    //附件类型获取  
  21.                    String contentType=new String( part.getContentType(),"gb2312");  
  22.                      
  23.                    //文本类型  
  24.                    if(contentType.contains("text")){  
  25.                       
  26.                     //文本内容获取  
  27.                         String content= new EncodedStringValue(part.getData()).getString();  
  28.                         //记录  
  29.                         MMs_Content.put("text",part.getData());                     }  
  30.                    //jpg图片类型  
  31.                    else if(contentType.contains("jpeg")){  
  32.                       
  33.                  //图片文件生成  
  34.                     Bitmap bmp=BitmapFactory.decodeByteArray(part.getData(), 0,part.getData().length);  
  35.                        if(bmp!=null){  
  36.                     //记录  
  37.                           MMs_Content.put("jpeg",part.getData());  
  38.                        }else  
  39.                         Log.i("xml","Bitmap is null");  
  40.                       
  41.                    }else{  
  42.                     //其他类型数据:音频等,暂不处理。  
  43.                    }  
  44.                }  
  45.            }  
  46.        }  

       4、向彩信中心返回成功状态信息。

             当我们成功下载数据后要向向彩信中心返回成功的状态(第三步解析获得的彩信id),彩信中心才认为我们成功接收到彩信。

          

[java]  view plain copy print ?
  1. //给彩信中心返回成功接收信息  
  2.             NotifyRespInd notifyRespInd = new NotifyRespInd(  
  3.                     PduHeaders.CURRENT_MMS_VERSION,  
  4.                     TransactionId, PduHeaders.STATUS_RETRIEVED);  
  5.           
  6.             mHttpBox = new HttpBox(MMSC, new PduComposer(context,notifyRespInd).make());  
  7.               
  8.             mHttpBox.setConnectTimeout(50 * 1000);  
  9.             mHttpBox.setReadTimeout(30 * 1000);  
  10.             mHttpBox.setRequestMethod(true);  
  11.   
  12.             mHttpBox.addHeader("User-Agent","Nokia6120c/4.21 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/4.21; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) Mozilla/5.0 AppleWebK");  
  13.             mHttpBox.addHeader("Accept","*/*, application/vnd.wap.mms-message, application/vnd.wap.sic");  
  14.             mHttpBox.addHeader("Content-Type","application/vnd.wap.mms-message");  
  15.             mHttpBox.addHeader("Accept-Charset","iso-8859-1, utf-8; q=0.7, *; q=0.7");  
  16.             mHttpBox.addHeader("Accept-Language","zh-cn, zh;q=1.0,en;q=0.5");  
  17.   
  18.             mHttpBox.connect();  
  19.               
  20.     //      mHttpBox.read();  
  21.     //      mmsData  = mHttpBox.getInData();  

 

     二、发送彩信

     这部分相对而言没有那么复杂,难点是pdu的组包,很多问题都是由组包不正确引起的,另外需要注意的一点是:要注意APN的切换,这样才能提高发送成功的成功率。这一部分的资料相对很多啊,我就不贴代码了。注意我开篇说的问题就行了,自己多试一下吧。

    这里提供一篇作为参考的文章,我就是根据这篇文章实现的彩信发送,但是同样要注意我开篇说的问题哦。

    彩信发送参考:http://blog.youkuaiyun.com/aniuaniuaniuaniu/article/details/7225967

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值