本人是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 }