[mobilesafe] 15_手机防盗的功能实现1-播放报警音乐

Android 4.0

发送指令#*alarm*#播放报警音乐

1、广播接收者
a) 重启广播接收者 android:name="android.intent.action.BOOT_COMPLETED"
权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
b) 接收短信接收者 android:name="android.provider.Telephony.SMS_RECEIVED"
权限:<uses-permission android:name="android.permission.RECEIVE_SMS"/>
2、后台发送短信
权限:<uses-permission android:name="android.permission.SEND_SMS"/>

一、注册接收开机重启的广播接收者:用于检测开启重启时,当前sim卡和绑定的sim卡是否相同
BootCompleteReceiver  
权限:RECEIVE_BOOT_COMPLETED(android4.1之前的,不配置该权限,也能收到广播事件,一个bug)
1、首先一个5554手机上绑定安全号码5556
2、由于android机在sim卡变化时,会自动重启的特性,所以可以注册一个开机重启的广播接收者,获取当前sim卡和保存的sim卡信息是否一致
a) 一个类继承BroadcastReceiver
public class BootCompleteReceiver extends BroadcastReceiver  
b) 在清单文件中注册该广播接收者
<receiver android:name="cn.zengfansheng.mobilesafe.receiver.BootCompleteReceiver">
    <intent-filter android:priority="1000">
        <action  android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>  
c) 然后在清单文件中声明权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>  
3、如果不一致,那么进行相对应的功能
a) 重启广播接收者BootCompleteReceiver 
package cn.zengfansheng.mobilesafe.receiver;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.util.Log;
 
/**
* 2、注册一个重启广播接收者-判断当前用户的sim卡和保存的sim是否一致,如果不一致,那么发送短信给安全号码。
*
* @author hacket
*
*/

public class BootCompleteReceiver extends BroadcastReceiver {
 
    private static final String TAG = "BootCompleteReceiver";
 
    @Override
    public void onReceive(Context context, Intent intent) {
 
        Log.i(TAG, "重启了。。。");
 
        SharedPreferences spf = context.getSharedPreferences("config",
                Context.MODE_PRIVATE);
 
        // 0、首先判断用户是否开启了手机防盗监控
        boolean isProtecting = spf.getBoolean("isProtecting", false);
 
        if (isProtecting) {// 开启了手机防盗
            // 1、获取保存的sim卡序列
            String saveSimSerialNumber = spf.getString("simSerialNumber", "");
            Log.i(TAG, "保存的安全号码:" + saveSimSerialNumber);
 
            // 2、获取当前手机sim卡的序列
            TelephonyManager tm = (TelephonyManager)          
                  context.getSystemService(Context.TELEPHONY_SERVICE);
            String realNum = tm.getSimSerialNumber() + "11";
 
            // 3、进行比较,如果不相等
            if (!saveSimSerialNumber.equals(realNum)) {// saveSafenum一定不为null,因为以前为null不给存的
 
                String saveSafenum = spf.getString("safenum", "");// 保存的安全号码
                Log.i(TAG, "sim卡不一样,发送短信给安全号码:" + saveSafenum);
                // 4、发送短信给安全号码
                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(saveSafenum, null, "sim is changed", null, null);
            }
        }
    }
}

二、注册一个SmsReceiver接收者,用于接收远程端发来的指令,并执行相对应的操作。
a) 清单文件配置
<receiver android:name="cn.zengfansheng.mobilesafe.receiver.SmsReceiver" >
    <intent-filter android:priority="1000" >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>
------------------------------------------
b) 接收短信广播接收者SmsReceiver.java
package cn.zengfansheng.mobilesafe.receiver;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.telephony.SmsMessage;
import android.util.Log;
import cn.zengfansheng.mobilesafe.R;
 
/**
* 3、接收信息的接收者
* @author hacket
*/

public class SmsReceiver extends BroadcastReceiver {
 
    private static final String TAG = "SmsReceiver";
 
    @Override
    public void onReceive(Context context, Intent intent) {
        // 后台发送短信
        Object[] objects = (Object[]) intent.getExtras().get("pdus");
        for (Object obj : objects) {
            SmsMessage message = SmsMessage.createFromPdu((byte[]) obj);
            // String messageSender = message.getOriginatingAddress();
            String messageBody = message.getMessageBody();
            if ("#*location*#".equals(messageBody)) {
                Log.i(TAG, "返回手机位置信息...");
            } else if ("#*alarm*#".equals(messageBody)) {
                Log.i(TAG, "播放报警音乐。。。");
                //方便的api播放音乐
                MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.ylzs);
                mediaPlayer.setLooping(true);// 循环播放
                mediaPlayer.setVolume(1.0f, 1.0f);
                mediaPlayer.start();
                abortBroadcast();// 终止广播,不被系统短信应用接收到短信
 
            } else if ("#*wipedata*#".equals(messageBody)) {
                Log.i(TAG, "清除手机数据。。。");
            } else if ("#*lockscreen*#".equals(messageBody)) {
                Log.i(TAG, "远程锁屏");
            }
        }
    }
 }
权限:
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>



结果:
当5554重启时:
a) 重启广播接收者 BootCompleteReceiver接到该事件,将当前sim卡id和保存的sim卡id比较,发现不同

b) 然后发送一条短信给5556,5556接收到短信,发送一条指令#*alarm*#给5554,但此时5554,并没有发现,而是被短信接收广播者 SmsReceiver接收,然后大声播放月亮之上。