又到了实战的时候了,这次我们来玩远程操控安卓手机。
市面上流行了很多安全卫士软件,它们都拥有远程操控手机的功能,如播放报警铃声,获取手机位置等等,这次我们就来看看怎么实现这些功能。
报警铃声的实现
说起所有的远程操控的功能中,就属于报警铃声最容易实现了,所以我们先实现这个。
首先建立一个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是无法接收到短信的。当然了,添加用户权限也是必须的。