有些不知道怎么用我们这个锁屏的功能 ,其实很简单的,我们只要把服务 开启了,然后如果 你要进行锁屏,那么就可以通过 另一台手机,发送一条锁屏的短信如:
#*lockscreen*#就会锁屏的啦,具体服务 怎么开,就要看看我们前面的内容 啦!
好啦,我们今天就来继续我们的手机防盗啊,今天我们应该就会把手机防盗这个功能全部完成它的啦,
昨天我们已经讲了怎样发送短信指令啦,今天我们就继续完善这个短信指令啦,就是增加锁屏操作啊,还有恢复到出厂模式啦,还有一个就是播放报警音乐啦
还有最重要的一个,我们要做一个流氓软件,没错,就是要做一个流氓软件,其实也不是啦,就是让一般的用户不知道怎样卸载我们的软件而已,所以当小偷偷到了我们的手机,也无法卸载掉我们的软件。
其实我们今天要讲的就是通过拿到系统硬件的一些对象,然后进行一些操作,这些都是Android已经封装好的啦,都在api文档里面有说的
我先告诉大家在那里找到,然后以后大家也可以多点去看一下那个文档啦
它其实也就是在那个DevicePolicies里面
这里面的东西大家都可以看一下
好啦,我们现在就要开始写代码啦,首先我们要创建一个Receiver来接收广播,但这个Receiver继承的不是BroadcastReceiver而是DeviceAdminReceiver
但是,从本质上来讲DeviceAdminReceiver也是继承了BroadcastReceiver的
com.xiaobin.security.receiver.MyAdminReceiver
package com.xiaobin.security.receiver; import android.app.admin.DeviceAdminReceiver; public class MyAdminReceiver extends DeviceAdminReceiver { }
然后在xml里面新建一个xml文件,然后写上下面的内容
myadmin.xml
<?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android" > <uses-policies> <limit-password /> <watch-login /> <reset-password /> <force-lock /> <wipe-data /> <expire-password /> <encrypted-storage /> <disable-camera /> </uses-policies> </device-admin>
好啦,现在,这个xml文件写好之后,我们就可以去AndroidManifest里面注册我们刚刚写的Receiver啦
<receiver android:name="com.xiaobin.security.receiver.MyAdminReceiver"> <meta-data android:name="android.app.device_admin" android:resource="@xml/myadmin" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
好啦,现在初始化工作,我们就完成的差不多啦,现在我们就要反逻辑加上去啦,我们就要在设置向导设置完成的时候进行设备的激活啦,也就是加入几行代码而已
//拿到一个设备管理器 DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); //new一个新的组件出来,用来启动注册管理器的界面 ComponentName componentName = new ComponentName(this, MyAdminReceiver.class); //判断是否已经注册,没有就进行注册 if(!devicePolicyManager.isAdminActive(componentName)) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); startActivity(intent); }
com.xiaobin.security.ui.SetupGuideActivity4
package com.xiaobin.security.ui; import android.app.Activity; import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import com.xiaobin.security.R; import com.xiaobin.security.receiver.MyAdminReceiver; public class SetupGuide4Activity extends Activity implements OnClickListener { private Button bt_pervious; private Button bt_finish; private CheckBox cb_protected; private SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.setup_guide4); bt_pervious = (Button) findViewById(R.id.bt_guide_pervious); bt_finish = (Button) findViewById(R.id.bt_guide_finish); bt_finish.setOnClickListener(this); bt_pervious.setOnClickListener(this); cb_protected = (CheckBox) findViewById(R.id.cb_guide_protected); sp = getSharedPreferences("config", Context.MODE_PRIVATE); boolean isProtecting = sp.getBoolean("isProtected", false); if(isProtecting) { cb_protected.setText("已经开启保护"); cb_protected.setChecked(true); } cb_protected.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { cb_protected.setText("已经开启保护"); Editor editor = sp.edit(); editor.putBoolean("isProtected", true); editor.commit(); } else { cb_protected.setText("没有开启保护"); Editor editor = sp.edit(); editor.putBoolean("isProtected", false); editor.commit(); } } }); } @Override public void onClick(View v) { switch(v.getId()) { case R.id.bt_guide_finish : if(cb_protected.isChecked()) { finishSetupGuide(); finish(); } else { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("提醒"); builder.setMessage("强烈建议您开启保护, 是否完成设置"); builder.setCancelable(false); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finishSetupGuide(); finish(); } }); builder.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finishSetupGuide(); } }); builder.create().show(); } break; case R.id.bt_guide_pervious : Intent intent = new Intent(this, SetupGuide3Activity.class); finish(); startActivity(intent); //这个是定义activity切换时的动画效果的 overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out); break; default : break; } } private void finishSetupGuide() { Editor editor = sp.edit(); editor.putBoolean("setupGuide", true);//记录是否已经进行过设置向导了 editor.commit(); //拿到一个设备管理器 DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); //new一个新的组件出来,用来启动注册管理器的界面 ComponentName componentName = new ComponentName(this, MyAdminReceiver.class); //判断是否已经注册,没有就进行注册 if(!devicePolicyManager.isAdminActive(componentName)) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); startActivity(intent); } } }
我们激活之后,那就可以进行锁屏啊,恢复到出厂模式这些操作啦
好啦,现在我们就来完善我们的短信指令啦,在处理短信指令那里进行添加指令啦
com.xiaobin.security.receiver.SmsReceiver
package com.xiaobin.security.receiver; import com.xiaobin.security.R; import com.xiaobin.security.engine.GPSInfoProvider; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.telephony.SmsManager; import android.telephony.SmsMessage; public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Object[] pdus = (Object[]) intent.getExtras().get("pdus"); for(Object pdu : pdus) { SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu); //拿到短信内容 String content = smsMessage.getMessageBody(); //拿到发送人的电话号码 String sender = smsMessage.getOriginatingAddress(); //这个是通过短信发送指令,然后进行一些操作的 if(content.equals("#*location*#")) { abortBroadcast();//终止广播,免得让小偷看到短信 GPSInfoProvider gpsInfoProvider = GPSInfoProvider.getInstance(context); String location = gpsInfoProvider.getLocation(); System.out.println(location); if(!location.equals("")) { //发送短信 SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(sender, null, location, null, null); } } else if(content.equals("#*lockscreen*#")) { DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); //重新设置密码,第一个参数就是密码,第二个参数暂时没有用,但要设置为0 manager.resetPassword("123", 0); //进行锁屏 manager.lockNow(); abortBroadcast(); } else if(content.equals("#*wipe*#")) { DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); //恢复到出厂模式,参数暂时没有用,但要置为0 manager.wipeData(0); abortBroadcast(); } else if(content.equals("#*alarm*#")) { //这个方法已经调用的prepare这个方法的啦,所以不用自己调用prepare这个方法 MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.jxmzf); //设置声音为最大声 mediaPlayer.setVolume(1.0f, 1.0f); mediaPlayer.start(); abortBroadcast(); } } } }
到现在为止,我们的这个软件就可以进行测试一下有没有效的啦。
而且你现在如果想卸载我们的这个软件,你会发现普通的卸载方式会卸载不了的,这就是我刚开始时候说的流氓软件啦,其实也没那么夸张啦,我们只是把设备激活了,所以无法卸载而已
只要我们进入到设置,然后去到位置与安全,然后去到选择设备,就会看到我们的程序已经在设备里面啦,只要把那个勾去掉,我们的程序就可以卸载的啦
好啦,今天我们讲得也差不多的啦,我们的手机防盗这个功能也算是完成的啦,如果大家还有什么疑问的,也可以留言,
我们接下来就会进入到下一个功能的开发的啦,其实上面的短信指令,还可以做很多东西的,大家可以根据自己的需要进行添加多一些指令,
好啦,明天我们就继续新功能的开发,如果有什么不明白的,可以回头看一下我们之前的课程。
今天源码下载