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>

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

<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

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。这个文件是用来说明开启超级管理员后用户所拥有的权限,代码如下:

     <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>
    
  • 在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>
      </receiver>
    

前置工作已经完成了,我们就来正式获取管理员权限吧。
我们在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是无法接收到短信的。当然了,添加用户权限也是必须的。
2、获取超级管理员权限,这需要三部走,

  • 要继承DeviceAdminReceiver,然后在mainfest中注册
  • 要在xml中写入获取超级管理员中能获取的权限
  • 通过代码或者直接在设置中激活超级管理员。
    以上就是这篇文章的全部内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容