Android实战--远程操控安卓手机

又到了实战的时候了,这次我们来玩远程操控安卓手机。
市面上流行了很多安全卫士软件,它们都拥有远程操控手机的功能,如播放报警铃声,获取手机位置等等,这次我们就来看看怎么实现这些功能。

报警铃声的实现

说起所有的远程操控的功能中,就属于报警铃声最容易实现了,所以我们先实现这个。

首先建立一个Android project

然后建立一个SmsReceive广播接收者,没错,就是这个,我们的目的就是使用广播接收者接收到短信,然后通过解析短信的内容来远程操控手机。
SmsReceive代码:

public class SmsReceive extends BroadcastReceiver {
    @Override
public void onReceive(Context context, Intent intent) {
        
}
}

那么如何才能解析短信呢?这其实非常简单,只要用以下几行代码就行了

Object[] objs = (Object[]) intent.getExtras().get("pdus");
    for (Object obj : objs) {
        // 获得短信内容
        SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj); // 此方法已过时
        String smsbody = sms.getMessageBody();
        String sender = sms.getOriginatingAddress();
        System.out.println("发件人:" + sender + "  内容:" + smsbody);
}

我们将这段解析短信的代码加入SmsReceive广播接收者的onReceive()方法之中,这时我们就可以监听到短信的信息了!
但是且慢,我们还必须在mainfest中注册广播接收者才能生效,要时刻牢记Android四大组件都是必须要注册才能生效的。

        
        
            
            
        
    

另外,接收短信是属于用户的隐私,所以还需要添加权限,如下:



OK,这时候我们就已经成功的监听到了短信了,够简单吧!现在就打开模拟器尝试着发一条短信看看有没有输出吧!

前期准备工作已经完成,那么我们就来操控报警短信吧。
在SmsReceive广播接收者的onReceive()方法中添加以下代码:

public void onReceive(Context context, Intent intent) {

    Object[] objs = (Object[]) intent.getExtras().get("pdus");
    ······
        System.out.println("发件人:" + sender + "  内容:" + smsbody);
        
        if ("#*music*#".equals(smsbody)){
            System.out.println("快点播放音乐");
            // 播放音乐
            MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.bestfriend); // 在res目录下的raw文件夹添加bestfriend的歌曲
            mediaPlayer.start();
        } 
        }
    }
}

妥妥的,现在当你发送"#music#到你的模拟器时,广播接收者就会解析短信,然后播放报警铃声。
真的是很简单的一个项目呀~~~
哎,不要吐槽,我们只是先来一点简单的东西但开胃菜,剩下的就稍微有些难度了。

擦除手机信息 & 远程锁屏 (上)

响起报警铃声是如此的简单,那么擦出手机信息,恢复出厂设置呢?
擦除手机信息和远程锁屏属于手机的危险操作,所以一般情况下是无法使用手机应用直接使用这些功能的。
这些高危操作都属于手机管理员的操作,所以我们必须要获得手机的超级管理员权限才能够操作。需要注意的是手机超级管理员与root是不同的,手机超级管理员指的是获得手机最高的权限,而root则是获得手机的所有权限。

获得手机超级管理员权限

手机超级管理员权限是在Android2.3的时候提出来的,它可以设置开屏密码,禁用摄像头,锁屏等等,具体可以查看Android官网:
https://developer.android.com/guide/topics/admin/device-admin.html

  • 获取超级管理员,首先要创建一个Admin类继承自DeviceAdminReceiver,当然了,里面可以重写很多方法,但是我们现在先不理。代码如下:

     public class Admin extends DeviceAdminReceiver {
    
     }
    
  • 然后我们要在res资源目录下创建一个xml目录,在里面创建device_admin_sample.xml。这个文件是用来说明开启超级管理员后用户所拥有的权限,代码如下:

     
     
     
     
     
      
     
     
     
     
     
     
    
  • 在manifest中注册DeviceAdminReceiver,添加代码如下:

          
          
    
          
              
          
      
    

前置工作已经完成了,我们就来正式获取管理员权限吧。
我们在MainActivity中添加两个按钮,一个register按钮,点击打开激活超级管理员权限,另一个unregister按钮,点击取消激活超级管理员权限。
要注意的是如果激活了超级管理员权限,那么以后是不能够直接卸载这个app的,必须要取消激活超级管理员权限之后才能正常卸载。
MainActivity代码如下:

public class MainActivity extends Activity {
private DevicePolicyManager devicePolicyManager;
private ComponentName componentName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    devicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
    componentName = new ComponentName(this, Admin.class);
    Button register = (Button) findViewById(R.id.register);
    register.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Launch the activity to have the user enable our admin.
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                    "激活超级管理员中");
            startActivity(intent);
        }
    });
    Button unregister = (Button) findViewById(R.id.unregister);
    unregister.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // 取消激活超级管理员
            if (devicePolicyManager.isAdminActive(componentName)){
                devicePolicyManager.removeActiveAdmin(componentName);
            }
        }
    });
}
}

在这里我们遇到两个陌生的API,一个是DevicePolicyManager,这个是设备权限管理器,使用它才能够管理锁屏、擦出手机数据等等功能。另一个是ComponentName,它用于打开其他应用程序中的Activity或服务的,因为启动超级管理员权限是要启动Android内置Activity才能激活的,所以需要使用ComponentName。
但我们点击register按钮的时候,app会直接打开另一个活动,不要慌,这是正常现象,点击Activate激活即可激活超级管理员,界面如下

Android实战--远程操控安卓手机_第1张图片
supermanager.png

当然了,这是用代码的方法来激活超级管理员,你也可以直接在设置中激活,方法是:Settings-security-Device administrators-我们的app。
要注意的是只有继承了DeviceAdminReceiver,以及在manifest注册过之后才会出现我们创建的app。

擦除手机信息 & 远程锁屏 (下)

现在我们终于可以远程擦除手机信息和远程锁屏了!回到我们的SmsReceive,继续在onReceive()中添加代码:

public class SmsReceive extends BroadcastReceiver {
private DevicePolicyManager mDevicePolicyManager;
private ComponentName mComponentName;

@Override
public void onReceive(Context context, Intent intent) {
    
    mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
    mComponentName = new ComponentName(context, Admin.class);
    
    Object[] objs = (Object[]) intent.getExtras().get("pdus");
    for (Object obj : objs) {
        // 获得短信内容
        SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
        String smsbody = sms.getMessageBody();
        String sender = sms.getOriginatingAddress();
        System.out.println("发件人:" + sender + "  内容:" + smsbody);
        
        if ("#*music*#".equals(smsbody)){               
            // 播放音乐
            MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.bestfriend);
            mediaPlayer.start();
        } else if ("#*wipedata*#".equals(smsbody)){
            // 擦出手机数据
            if(mDevicePolicyManager.isAdminActive(mComponentName)) {
                mDevicePolicyManager.wipeData(0);
            }
        } else if ("#*lock*#".equals(smsbody)){
            // 锁屏
            if (mDevicePolicyManager.isAdminActive(mComponentName)){
                mDevicePolicyManager.lockNow();
            }
        }
        
    }
}
}

这时候你发送短信#wipedata#或者#lock#就能实现远程擦除数据和锁屏了。
不过需要提示的是擦出数据在模拟器中不太好用,有可能会导致模拟器卡死,还有小心在真机测试,这可真是会恢复出厂设置的。

总结

这次的实战课程就到这里为止了,由于内容并不复杂,也就不上传项目到github中了。
这个项目要注意的有:
1、想要解析短信,必须要短信的广播接收者中添加

        
            
        

否则app是无法接收到短信的。当然了,添加用户权限也是必须的。
2、获取超级管理员权限,这需要三部走,

  • 要继承DeviceAdminReceiver,然后在mainfest中注册
  • 要在xml中写入获取超级管理员中能获取的权限
  • 通过代码或者直接在设置中激活超级管理员。
    以上就是这篇文章的全部内容

你可能感兴趣的:(Android实战--远程操控安卓手机)