本人是Android新手,最近做了一个关于监听手机短信功能的应用,我在网上看资料了解到广播分为有序广播和无序广播,有序广播;无序广播又称普通广播,其中的利弊我也一时没搞清楚,我用的是有序广播实现的,具体思路如下

1、定义一个接收短信的广播

2、当系统接收到短信时,拦截短信,获取短信内容

3、将指定的短信内容转发到服务器

下面是我的实现方法

1、添加一个短消息接收类

 1 import java.util.ArrayList;
 2 import java.util.HashMap;
 3 import java.util.List;
 4 import java.util.Map;
 5 import org.apache.http.HttpResponse;
 6 import org.apache.http.NameValuePair;
 7 import org.apache.http.client.entity.UrlEncodedFormEntity;
 8 import org.apache.http.client.methods.HttpPost;
 9 import org.apache.http.impl.client.DefaultHttpClient;
10 import org.apache.http.message.BasicNameValuePair;
11 import android.content.BroadcastReceiver;
12 import android.content.Context;
13 import android.content.Intent;
14 import android.telephony.SmsMessage;
15 import android.telephony.TelephonyManager;
16 import android.util.Log;
17 import android.widget.Toast;
18 
19 public class MessageBroadcastReceiver extends BroadcastReceiver {
20      private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
21      String uri="http://127.0.0.1:8080/Home/SmsHandler";
22         
23         @Override  
24         public void onReceive(Context context, Intent intent) {
25             //监听短信广播
26             if (intent != null && intent.getAction() != null  
27                     && ACTION.compareToIgnoreCase(intent.getAction()) == 0) {   
28                 Object[] pduArray = (Object[]) intent.getExtras().get("pdus");   
29                 SmsMessage[] messages = new SmsMessage[pduArray.length];   
30                 //SmsManager sms=SmsManager.getDefault();
31                String localTelPhoneNumber=getPhoneNumber(context);
32                              
33                 for (int i = 0; i < pduArray.length; i++) {
34                     messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
35                     if(messages[i].getDisplayMessageBody().contains("测试数据")) //制定短信转发过滤条件
36                     {
37                         String filterSms=messages[i].getDisplayMessageBody();
38                          Map<String, String> params=new HashMap<String, String>();
39                          params.put("phoneNumber", localTelPhoneNumber);  
40                          params.put("smsContent", filterSms); 
41                          try {
42                              sendHttpClientPOSTRequest(uri,params,"UTF-8"); 
43                              Toast.makeText(context,
44                                      "短信验证码已转发!",
45                                      Toast.LENGTH_LONG).show();
46                              // show first message                              
47                          } catch (Exception e) { 
48                               Toast.makeText(context,
49                                      e.toString(),
50                                       Toast.LENGTH_LONG).show();
51                              e.printStackTrace();  
52                          }
53                     }
54                 }   
55                 Log.d("ConvertToMsg", "SMS Message Received.");   
56             }   
57         }   
58         
59         /** 
60         * 通过HttpClient发送Post请求 
61         * @param path 请求路径 
62         * @param params 请求参数 
63         * @param ecoding 请求编码 
64         * @return 请求是否成功 
65         */  
66         private boolean sendHttpClientPOSTRequest(String path,
67               Map<String, String> params, String ecoding) throws Exception {  
68             
69           List<NameValuePair> pair=new ArrayList<NameValuePair>();//存放请求参数
70           
71           if(params!=null && !params.isEmpty()){  
72               for (Map.Entry<String, String> entry : params.entrySet()) {  
73                   pair.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));  
74               }
75           }
76           
77           UrlEncodedFormEntity enFormEntity=new UrlEncodedFormEntity(pair,ecoding);  
78           HttpPost httpPost=new HttpPost(path);  
79           httpPost.setEntity(enFormEntity);  
80           DefaultHttpClient client=new DefaultHttpClient();
81           HttpResponse response=client.execute(httpPost);
82           if(response.getStatusLine().getStatusCode()==200){        
83               return true;      
84           }  
85           
86           return false;  
87         }
88         
89             /* getPhoneNumber方法返回当前手机的电话号码,
90                * 同时必须在androidmanifest.xml中
91                * 加入 android.permission.READ_PHONE_STATE 这个权限
92                */
93               private String getPhoneNumber(Context context){
94                   TelephonyManager mTelephonyMgr;  
95                   mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);   
96                   return mTelephonyMgr.getLine1Number();  
97               }  
98 }
短信接收广播

相关文章: