Android实例-手机安全卫士(二十九)-接受安全号码发送的指令

一、目标

  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或者context.MODE_PRIVATE;

    ②.通过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

 

posted @ 2015-04-09 17:10  红烧大白鲨  阅读(254)  评论(0编辑  收藏  举报