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四大组件都是必须要注册才能生效的。

    <receiver android:name="com.example.controldevice.SmsReceive" >
    <intent-filter android:priority="1000" >
        <!-- 获取短信接收事件 -->
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

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

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,添加代码如下:

  <receiver
  android:name="com.example.controldevice.Admin"
  android:description="@string/sample_device_admin_description"
  android:label="@string/sample_device_admin"
  android:permission="android.permission.BIND_DEVICE_ADMIN" >
  <meta-data
      android:name="android.app.device_admin"
      android:resource="@xml/device_admin_sample" />

  <intent-filter>
      <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
  </intent-filter>
前置工作已经完成了,我们就来正式获取管理员权限吧。 我们在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激活即可激活超级管理员,界面如下

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、想要解析短信,必须要短信的广播接收者中添加

    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>

否则app是无法接收到短信的。当然了,添加用户权限也是必须的。

  • 4
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值