一、目标
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>
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 }