標籤:
一、目標
1、利用廣播接收者接受安全號碼發送的簡訊;
2、根據簡訊內容完成相應指令操作(此處暫以Toast形式代替)。
二、代碼實現
1、在receiver包下建立一個SMSReceiver類繼承BroadcastReceiver,並在功能資訊清單檔(AndroidManifest.xml)中的<application>內註冊該receiver,名稱為其全路徑名稱,意圖過濾器(<intent-filter>)中設定優先權(android:priority)高一些(如1000),活動(<action>)為簡訊接受。
註冊receiver的代碼如下:
1 <receiver android:name="com.example.mobilesafe.receiver.SMSReceiver">2 <intent-filter android:priority="1000">3 <action android:name="android.provider.Telephony.SMS_RECEIVED"/>4 </intent-filter> 5 </receiver>
View Code
2、增加接受簡訊的許可權:<uses-permission android:name="android.permission.RECEIVE_SMS"/>。
3、在建立的SMSReceiver類中onReceive方法中實現接受簡訊並根據其內容完成相關操作(可參照相關模板代碼)
①.在主代碼中定義SharedPreferences對象,用於讀取設定檔中的安全號碼,然後在onReceive方法中通過第一個參數context(上下文)的getSharedPreferences(String name, int mode)方法擷取名為“config”的設定檔,mode為0;
②.通過onReceive方法第二個傳入參數intent的getExtras()方法擷取該intent內的map集合,再通過get(String key)擷取簡訊的集合,此處的key為“pdus”,傳回值為object數組(因為簡訊有很多條,需要強轉);
③.遍曆擷取的object數組,可採用增強for迴圈遍曆。在迴圈中:
1).通過SmsMessage(android.telephony.SmsMessage包下)對象的createFromPdu(byte[] pdu)方法擷取每一條簡訊(SmsMessage)對象;
2).通過簡訊(SmsMessage)對象的getOriginatingAddress()方法擷取該條簡訊String類型的寄件者資訊;
3).通過簡訊(SmsMessage)對象的getMessageBody()方法擷取該條簡訊String類型的簡訊內容;
4).擷取SharedPreferences對象的getString(String key, String defValue)方法擷取設定檔中鍵名為“security_number”所對應的值,並通過equals方法判斷該值與發送人是否相等;
5).如果相等則判斷簡訊內容是否與對應的指令代碼相等,若相等則在其中完成相應的指令操作(可用if...else if...語句或者switch語句進行判斷)
(具體指令的操作放在後續講解,此處先用Toast替代)
6).相關指令操作完成後調用abortBroadcast()方法關閉廣播,防止使用者接受簡訊(通過receiver的優先順序priority實現)。
建立SMSReceiver類代碼:
1 public class SMSReceiver extends BroadcastReceiver { 2 private SharedPreferences sp; 3 4 @Override 5 public void onReceive(Context context, Intent intent) { 6 sp = context.getSharedPreferences("config",0); 7 //通過pdus方式擷取所有簡訊組成的object數組 8 Object[] objs = (Object[]) intent.getExtras().get("pdus"); 9 //遍曆object數組,擷取裡面的每一條簡訊內容10 for(Object obj:objs){11 //擷取具體的每一條簡訊12 SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);13 //擷取簡訊寄件者資訊14 String sender = sms.getOriginatingAddress();15 String body = sms.getMessageBody();16 if(sp.getString("security_number", "").equals(sender)){17 if("#*location*#".equals(body)){18 //得到GPS位置19 Toast.makeText(context, "已得到GPS位置", 0).show();20 abortBroadcast();21 }else if("#*alarm*#".equals(body)){22 //播放警示音樂23 Toast.makeText(context, "已播放警示音樂", 0).show();24 abortBroadcast();25 }else if("#*wipedata*#".equals(body)){26 //遠程銷毀資料27 Toast.makeText(context, "已遠程銷毀資料", 0).show();28 abortBroadcast();29 }else if("#*lockscreen*#".equals(body)){30 //遠程鎖屏31 Toast.makeText(context, "已遠程鎖屏", 0).show();32 abortBroadcast();33 }34 }35 }36 }37 }View Code
Android執行個體-手機安全衛士(二十九)-接受安全號碼發送的指令