微信红包插件启发

为了让家里的旧android手机得到充分的利用,受自动抢红包插件启发,结合网络应用可以达到远程控制的目的,而我们这里说的简易监控,就是远程控制手机摄像头开关,想什么时候监控什么时候监控的简易应用。

那么要达到随时随地都可以打开摄像头的效果,除了保持手机开机以外,那就需要我们有能够唤起手机某应用的权利,有两个目前看来最靠谱的方案:

  1. 利用手机的拨号或者短信应用,你拨打手机号码或者发短信即可唤醒手机,然后利用android提供的AccessibilityService进行开发,去监控状态栏进而打开指定页面监控页面控件,并打开摄像头进行监控,前提条件是手机必须装sim卡;
  2. 利用微信的视频通话功能,AccessibilityService进行自动拨打和接听的动作去打开摄像头。毕竟微信可以说是常驻内存,可以随时通过消息唤醒,而且其各项优化已经帮我们节省了很多开销,考虑到家庭场景,安装微信并登录,wifi足够了。

如果没有wifi的情况下只能采用1方案,利用移动4G网络进行视频通信,这里我们采用方案2,其实两者原理是一样的,都是利用AccessibilityService去监控手机状态,代码进行相应的处理,达到自动化的目的。

准备工作

一部android手机,微信,两个互为好友的微信号。

方案实现

AccessibilityService的用法不再赘述,继承AccessibilityService并实现onAccessibilityEvent,来监听通知栏和界面变化,下面是核心代码:

@Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        int eventType = event.getEventType();
        Log.d("demo","eventType = " + eventType);
        switch (eventType) {
            //监听通知栏消息
            case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
                break;
            //监听是否进入微信来电提醒界面
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                String className = event.getClassName().toString();
                Log.d("demo","classname = " + className);
                if("com.tencent.mm.plugin.voip.ui.VideoActivity".equals(className)){
                    //自动接听视频通话
                    answerVideo();
                }
                break;
        }
    }
    
    private void answerVideo(){
        Log.d("demo","answerVideo");
        AccessibilityNodeInfo rootNode = null;
        List<AccessibilityNodeInfo> list = null;
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            rootNode = getRootInActiveWindow();//API>=16
            if(rootNode == null)
                return;
            list = rootNode.findAccessibilityNodeInfosByText("接听");
            for(AccessibilityNodeInfo answerNode : list){
                if(answerNode != null && answerNode.getText() != null){
                    Log.d("demo","nodeText = " + answerNode.getText().toString());
                    if(answerNode.getText().toString().equals("接听")){
                        AccessibilityNodeInfo parent = answerNode.getParent();
                        for (int i=parent.getChildCount()-1;i>=0;i--){
                            if(parent.getChild(i).isClickable()){
                                parent.getChild(i).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                                return;
                            }
                        }
                    }
                }
            }
        }else{
        }
    }
复制代码

其原理很简单,监听微信来电的界面变化,当有视频邀请到达时,微信会启动是否接听视频通话的界面(这里为我们省去了很多事),我们要做的就是找到“接听”的控件,模拟点击就行了。getRootInActiveWindow()方法是API 16才支持,即android系统4.1及以上才可以使用此方法。

完整项目我上传在链接: https://pan.baidu.com/s/1nuM5HXJ 密码: y2c2

完整项目里加入了通过监听通知栏未接来电的消息,来启动微信的操作,以防太久没有启动微信时,视频通话邀请唤不起微信的情况。

为了防止自动接听任意来电,可以在代码里面可以加上对微信号的判断/电话号码的判断等,来提升安全等级,其次要使用需在android系统设置的辅助服务里打开,可以说是很安全了。

自此,一个安全简易的监控实现完成,本文仅供实践学习参考。