美文网首页AndroidAndroid开发经验谈Android开发
Android实战--远程操控安卓手机

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

作者: 宝塔山上的猫 | 来源:发表于2016-07-04 17:16 被阅读1344次

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

    报警铃声的实现

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

    首先建立一个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中写入获取超级管理员中能获取的权限
    • 通过代码或者直接在设置中激活超级管理员。
      以上就是这篇文章的全部内容

    相关文章

      网友评论

        本文标题:Android实战--远程操控安卓手机

        本文链接:https://www.haomeiwen.com/subject/nygcjttx.html