【Android开发工作笔记】之接收和拦截解析短信功能

来源:互联网 发布:python sample 编辑:程序博客网 时间:2024/05/17 04:07

被虐了很久的短信接发功能,简直了,觉得自己可以羽化升天了。不过做完之后感觉仿佛能够更深刻理解Receuver机构了呢(呵呵)。。

那简短的说一下(根本不可能简短好么?!!!!)

1.要在mainfest中声明权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/> 
   <uses-permission android:name="android.permission.READ_SMS"/>
 
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" /> 

2.在工程里面添加两个类,分别是SendSMSReceiver(偷了个懒所以写成了MSManager的内部类)和ReceiveSMSReceiver,然后注册监听,这里用了两种方式去注册,mainfest注册和代码注册:

IntentFilter filterSend;  
filterSend = new IntentFilter(SMS_SEND_ACTION);  
        mSendReceiver = new SendSMSReceiver();  
    context.registerReceiver(mSendReceiver,filterSend);
//代码注册

           <receiver android:name=".ReceiveSMSReceiver" android:exported="true">
           <intent-filter android:priority="1000">
           <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
           </intent-filter>
           </receiver>
//mainfest中注册,需要特别注意的是:Android:如果是单独的java类则直接写类名,同时也要注意该java类是否在mainfest声明的package中。<action android:name="android.provider.Telephony.SMS_RECEIVED"/>设置响应的action。


3.之后就是漫长的码代码之路,(其实还好啦)

判定发短信的code:
class SendSMSReceiver extends BroadcastReceiver {  
 @Override  
 public void onReceive(Context context, Intent intent) {  
   // TODO Auto-generated method stub  
  
   /* android.content.BroadcastReceiver.getResultCode()方法 */  
   switch (getResultCode()) {  
   case Activity.RESULT_OK:  
    /* 发送短信成功 */
    处理ing~~~~~~~~~~~~~
 
    break;  
   case SmsManager.RESULT_ERROR_GENERIC_FAILURE:  
    /* 发送短信失败 */  
   case SmsManager.RESULT_ERROR_RADIO_OFF:  
   case SmsManager.RESULT_ERROR_NULL_PDU:  
   default:
   
//  
      
    break;  
   }  
    

 }  
}  

发送短信的code:
public void SendMessage()



/* 创建自定义Action常数的Intent(给PendingIntent参数之用) */  
Intent itSend = new Intent(SMS_SEND_ACTION);  
/* sentIntent参数为传送后接受的广播信息PendingIntent */  
PendingIntent mSendPI = PendingIntent.getBroadcast(  
context,  
(int) System.currentTimeMillis(), itSend,  
PendingIntent.FLAG_UPDATE_CURRENT);
SmsManager smsManager = SmsManager.getDefault();  
                //发送短信的关键信息
String sendStr ="hfcx";
                String sendNum ="10086"; 
smsManager.sendTextMessage(sendNum , null,sendStr ,  mSendPI, null);//发送短信的关键!
                
 
  }
接收短信的code:
public class ReceiveSMSReceiver extends BroadcastReceiver {
//  this.context = context;
          String nowState = "";//状态判断
    @Override  
    public void onReceive(Context context, Intent intent) {  
     
    Bundle bundle = intent.getExtras();  
         SmsMessage msg = null; //接收的短信 
      
         if (null != bundle) {  
             Object[] smsObj = (Object[]) bundle.get("pdus");  
             for (Object object : smsObj) {  
                 msg = SmsMessage.createFromPdu((byte[]) object);   
                 if (msg.getOriginatingAddress().equals("10086")) {
                  String messageBody = msg.getDisplayMessageBody();
                    Log.d("received message is", messageBody);
                  String sucFlagString  = "余额";//关键信息
                     nowState= "firstSmsSendSuc";
                     if(messageBody.indexOf(sucFlagString) > 0){//如果匹配成功
                          nowState = "WaitFirst";//第一条短信发送成功
                          messageBody=messageBody.trim();//去掉结尾的空格
                       String autoCode="";
                       if(messageBody != null && !"".equals(messageBody)){
                                 //这里我们多加了一个功能就是回复接收的短信
                       for(int i=0;i<messageBody.length();i++){
                           if(messageBody.charAt(i)>=48 && messageBody.charAt(i)<=57){
                          autoCode+=messageBody.charAt(i); //把短信中的数字全部截取出来
                            }
                                }
                     SMSManager.setCostSms(autoCode);(return autoCode;) //发送验证码
                      SMSManager.instance.sendAutoBuySms(autoCode);//发送第二条短信
                       }
                     }          
                    //判断是否收到购买成功短信回执 2
                    if (nowState.equalsIgnoreCase( "firstSmsSendSuc")) { 
                   String sucSendString  = "错误";//关键短信
                   if(messageBody.indexOf(sucSendString) > 0){
                  nowState = "SecondSendSuc";
                      //成功接口!
                   } else
                   {
                     //失败接口!
                   }
                    }
                }    
           } 
       }
    }
}



4.备注:

-1)在SMSManager中必须要初始化一个intent,因为SendSMSReceiver是写在SMSManager中的内部类所以需要SMSManager中进行注册,注册具体代码见上;

-2)在SMSManager中初始化一个本类的对象,用于在其他类引用该类的public成员
public static SMSManager instance = null;

public static SMSManager getInstance()
{
return instance;
}



1 0
原创粉丝点击