Android项目实战--手机卫士11--锁屏操作与恢复出厂模式

有些不知道怎么用我们这个锁屏的功能 ,其实很简单的,我们只要把服务 开启了,然后如果 你要进行锁屏,那么就可以通过 另一台手机,发送一条锁屏的短信如:

  1. #*lockscreen*#  
#*lockscreen*#
就会锁屏的啦,具体服务 怎么开,就要看看我们前面的内容 啦!

好啦,我们今天就来继续我们的手机防盗啊,今天我们应该就会把手机防盗这个功能全部完成它的啦,

昨天我们已经讲了怎样发送短信指令啦,今天我们就继续完善这个短信指令啦,就是增加锁屏操作啊,还有恢复到出厂模式啦,还有一个就是播放报警音乐啦

还有最重要的一个,我们要做一个流氓软件,没错,就是要做一个流氓软件,其实也不是啦,就是让一般的用户不知道怎样卸载我们的软件而已,所以当小偷偷到了我们的手机,也无法卸载掉我们的软件。

其实我们今天要讲的就是通过拿到系统硬件的一些对象,然后进行一些操作,这些都是Android已经封装好的啦,都在api文档里面有说的

我先告诉大家在那里找到,然后以后大家也可以多点去看一下那个文档啦


它其实也就是在那个DevicePolicies里面

这里面的东西大家都可以看一下


好啦,我们现在就要开始写代码啦,首先我们要创建一个Receiver来接收广播,但这个Receiver继承的不是BroadcastReceiver而是DeviceAdminReceiver

但是,从本质上来讲DeviceAdminReceiver也是继承了BroadcastReceiver的

com.xiaobin.security.receiver.MyAdminReceiver

  1. package com.xiaobin.security.receiver;  
  2.   
  3. import android.app.admin.DeviceAdminReceiver;  
  4.   
  5. public class MyAdminReceiver extends DeviceAdminReceiver  
  6. {  
  7.   
  8. }  
package com.xiaobin.security.receiver;

import android.app.admin.DeviceAdminReceiver;

public class MyAdminReceiver extends DeviceAdminReceiver
{

}

这个类很简单,我们什么都不用干,但是我们还是要把它注册到AndroidManifest里面去的,但是我们先不注册,我们还要在res目录下面新建一个目录名为xml

然后在xml里面新建一个xml文件,然后写上下面的内容

myadmin.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <device-admin xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <uses-policies>  
  5.         <limit-password />  
  6.   
  7.         <watch-login />  
  8.   
  9.         <reset-password />  
  10.   
  11.         <force-lock />  
  12.   
  13.         <wipe-data />  
  14.   
  15.         <expire-password />  
  16.   
  17.         <encrypted-storage />  
  18.   
  19.         <disable-camera />  
  20.     </uses-policies>  
  21.   
  22. </device-admin>  
<?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就是定义一些设备的信息而已,大家看那个名字也可以知道有什么用的啦,所以只要照着写就行啦


好啦,现在,这个xml文件写好之后,我们就可以去AndroidManifest里面注册我们刚刚写的Receiver啦

  1.   <receiver   
  2.       android:name="com.xiaobin.security.receiver.MyAdminReceiver">  
  3. <meta-data android:name="android.app.device_admin"  
  4.         android:resource="@xml/myadmin" />  
  5. <intent-filter>  
  6.     <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />  
  7. </intent-filter>  
  8. /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>

可以看到它多了一个<meta-data>的节点,这个节点就是指定我们刚刚写的xml文件的

好啦,现在初始化工作,我们就完成的差不多啦,现在我们就要反逻辑加上去啦,我们就要在设置向导设置完成的时候进行设备的激活啦,也就是加入几行代码而已

  1. //拿到一个设备管理器   
  2. DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);  
  3. //new一个新的组件出来,用来启动注册管理器的界面   
  4. ComponentName componentName = new ComponentName(this, MyAdminReceiver.class);  
  5. //判断是否已经注册,没有就进行注册   
  6. if(!devicePolicyManager.isAdminActive(componentName))  
  7. {  
  8.     Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
  9.     intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);  
  10.     startActivity(intent);  
  11. }  
		//拿到一个设备管理器
		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);
		}

上面的代码我们都是在设置向导完成的时候做的,也就是在SetupGuideActivity4里面完成的,下面是完整的SetupGuideActivity4这个类的完整代码

com.xiaobin.security.ui.SetupGuideActivity4

  1. package com.xiaobin.security.ui;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.app.admin.DevicePolicyManager;  
  6. import android.content.ComponentName;  
  7. import android.content.Context;  
  8. import android.content.DialogInterface;  
  9. import android.content.Intent;  
  10. import android.content.SharedPreferences;  
  11. import android.content.SharedPreferences.Editor;  
  12. import android.os.Bundle;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.CheckBox;  
  17. import android.widget.CompoundButton;  
  18. import android.widget.CompoundButton.OnCheckedChangeListener;  
  19.   
  20. import com.xiaobin.security.R;  
  21. import com.xiaobin.security.receiver.MyAdminReceiver;  
  22.   
  23. public class SetupGuide4Activity extends Activity implements OnClickListener  
  24. {  
  25.     private Button bt_pervious;  
  26.     private Button bt_finish;  
  27.     private CheckBox cb_protected;  
  28.     private SharedPreferences sp;  
  29.       
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState)  
  32.     {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.setup_guide4);  
  35.           
  36.         bt_pervious = (Button) findViewById(R.id.bt_guide_pervious);  
  37.         bt_finish = (Button) findViewById(R.id.bt_guide_finish);  
  38.         bt_finish.setOnClickListener(this);  
  39.         bt_pervious.setOnClickListener(this);  
  40.           
  41.         cb_protected = (CheckBox) findViewById(R.id.cb_guide_protected);  
  42.           
  43.         sp = getSharedPreferences("config", Context.MODE_PRIVATE);  
  44.         boolean isProtecting = sp.getBoolean("isProtected"false);  
  45.         if(isProtecting)  
  46.         {  
  47.             cb_protected.setText("已经开启保护");  
  48.             cb_protected.setChecked(true);  
  49.         }  
  50.           
  51.         cb_protected.setOnCheckedChangeListener(new OnCheckedChangeListener()  
  52.         {  
  53.             @Override  
  54.             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)  
  55.             {  
  56.                 if(isChecked)  
  57.                 {  
  58.                     cb_protected.setText("已经开启保护");  
  59.                     Editor editor = sp.edit();  
  60.                     editor.putBoolean("isProtected"true);  
  61.                     editor.commit();  
  62.                 }  
  63.                 else  
  64.                 {  
  65.                     cb_protected.setText("没有开启保护");  
  66.                     Editor editor = sp.edit();  
  67.                     editor.putBoolean("isProtected"false);  
  68.                     editor.commit();  
  69.                 }  
  70.             }  
  71.         });  
  72.     }  
  73.   
  74.     @Override  
  75.     public void onClick(View v)  
  76.     {  
  77.         switch(v.getId())  
  78.         {  
  79.             case R.id.bt_guide_finish :   
  80.                 if(cb_protected.isChecked())  
  81.                 {  
  82.                     finishSetupGuide();  
  83.                     finish();  
  84.                 }  
  85.                 else  
  86.                 {  
  87.                     AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  88.                     builder.setTitle("提醒");  
  89.                     builder.setMessage("强烈建议您开启保护, 是否完成设置");  
  90.                     builder.setCancelable(false);  
  91.                     builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()  
  92.                     {  
  93.                         @Override  
  94.                         public void onClick(DialogInterface dialog, int which)  
  95.                         {  
  96.                             finishSetupGuide();  
  97.                             finish();  
  98.                         }  
  99.                     });  
  100.                     builder.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()  
  101.                     {  
  102.                         @Override  
  103.                         public void onClick(DialogInterface dialog, int which)  
  104.                         {  
  105.                             finishSetupGuide();  
  106.                         }  
  107.                     });  
  108.                     builder.create().show();  
  109.                 }  
  110.                 break;  
  111.                   
  112.             case R.id.bt_guide_pervious :   
  113.                 Intent intent = new Intent(this, SetupGuide3Activity.class);  
  114.                 finish();  
  115.                 startActivity(intent);  
  116.                 //这个是定义activity切换时的动画效果的   
  117.                 overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);  
  118.                 break;  
  119.                   
  120.             default :   
  121.                 break;  
  122.         }  
  123.     }  
  124.       
  125.     private void finishSetupGuide()  
  126.     {  
  127.         Editor editor = sp.edit();  
  128.         editor.putBoolean("setupGuide"true);//记录是否已经进行过设置向导了   
  129.         editor.commit();  
  130.           
  131.         //拿到一个设备管理器   
  132.         DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);  
  133.         //new一个新的组件出来,用来启动注册管理器的界面   
  134.         ComponentName componentName = new ComponentName(this, MyAdminReceiver.class);  
  135.         //判断是否已经注册,没有就进行注册   
  136.         if(!devicePolicyManager.isAdminActive(componentName))  
  137.         {  
  138.             Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);  
  139.             intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);  
  140.             startActivity(intent);  
  141.         }  
  142.     }  
  143.   
  144. }  
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

  1. package com.xiaobin.security.receiver;  
  2.   
  3. import com.xiaobin.security.R;  
  4. import com.xiaobin.security.engine.GPSInfoProvider;  
  5.   
  6. import android.app.admin.DevicePolicyManager;  
  7. import android.content.BroadcastReceiver;  
  8. import android.content.Context;  
  9. import android.content.Intent;  
  10. import android.media.MediaPlayer;  
  11. import android.telephony.SmsManager;  
  12. import android.telephony.SmsMessage;  
  13.   
  14. public class SmsReceiver extends BroadcastReceiver  
  15. {  
  16.   
  17.     @Override  
  18.     public void onReceive(Context context, Intent intent)  
  19.     {  
  20.         Object[] pdus = (Object[]) intent.getExtras().get("pdus");  
  21.         for(Object pdu : pdus)  
  22.         {  
  23.             SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);  
  24.             //拿到短信内容   
  25.             String content = smsMessage.getMessageBody();  
  26.             //拿到发送人的电话号码   
  27.             String sender = smsMessage.getOriginatingAddress();  
  28.               
  29.             //这个是通过短信发送指令,然后进行一些操作的   
  30.             if(content.equals("#*location*#"))  
  31.             {  
  32.                 abortBroadcast();//终止广播,免得让小偷看到短信   
  33.                 GPSInfoProvider gpsInfoProvider = GPSInfoProvider.getInstance(context);  
  34.                 String location = gpsInfoProvider.getLocation();  
  35.                 System.out.println(location);  
  36.                 if(!location.equals(""))  
  37.                 {  
  38.                     //发送短信   
  39.                     SmsManager smsManager = SmsManager.getDefault();  
  40.                     smsManager.sendTextMessage(sender, null, location, nullnull);  
  41.                 }  
  42.             }  
  43.             else if(content.equals("#*lockscreen*#"))  
  44.             {  
  45.                 DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);  
  46.                 //重新设置密码,第一个参数就是密码,第二个参数暂时没有用,但要设置为0   
  47.                 manager.resetPassword("123"0);  
  48.                 //进行锁屏   
  49.                 manager.lockNow();  
  50.                 abortBroadcast();  
  51.             }  
  52.             else if(content.equals("#*wipe*#"))  
  53.             {  
  54.                 DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);  
  55.                 //恢复到出厂模式,参数暂时没有用,但要置为0   
  56.                 manager.wipeData(0);  
  57.                 abortBroadcast();  
  58.             }  
  59.             else if(content.equals("#*alarm*#"))  
  60.             {  
  61.                 //这个方法已经调用的prepare这个方法的啦,所以不用自己调用prepare这个方法   
  62.                 MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.jxmzf);  
  63.                 //设置声音为最大声   
  64.                 mediaPlayer.setVolume(1.0f, 1.0f);  
  65.                 mediaPlayer.start();  
  66.                 abortBroadcast();  
  67.             }  
  68.         }  
  69.     }  
  70.   
  71. }  
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();
			}
		}
	}

}

从上面的代码我们可以看到,我们新增了三个指令,就是锁屏和恢复到出厂模式,还有播放报警音乐,播放报警音乐的音乐我们放到了res/raw下面的啦,如果没有这个目录,可以新建一个。

到现在为止,我们的这个软件就可以进行测试一下有没有效的啦。

而且你现在如果想卸载我们的这个软件,你会发现普通的卸载方式会卸载不了的,这就是我刚开始时候说的流氓软件啦,其实也没那么夸张啦,我们只是把设备激活了,所以无法卸载而已

只要我们进入到设置,然后去到位置与安全,然后去到选择设备,就会看到我们的程序已经在设备里面啦,只要把那个勾去掉,我们的程序就可以卸载的啦




好啦,今天我们讲得也差不多的啦,我们的手机防盗这个功能也算是完成的啦,如果大家还有什么疑问的,也可以留言,

我们接下来就会进入到下一个功能的开发的啦,其实上面的短信指令,还可以做很多东西的,大家可以根据自己的需要进行添加多一些指令,

好啦,明天我们就继续新功能的开发,如果有什么不明白的,可以回头看一下我们之前的课程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值