微信红包插件启发
为了让家里的旧android手机得到充分的利用,受自动抢红包插件启发,结合网络应用可以达到远程控制的目的,而我们这里说的简易监控,就是远程控制手机摄像头开关,想什么时候监控什么时候监控的简易应用。
那么要达到随时随地都可以打开摄像头的效果,除了保持手机开机以外,那就需要我们有能够唤起手机某应用的权利,有两个目前看来最靠谱的方案:
- 利用手机的拨号或者短信应用,你拨打手机号码或者发短信即可唤醒手机,然后利用android提供的AccessibilityService进行开发,去监控状态栏进而打开指定页面监控页面控件,并打开摄像头进行监控,前提条件是手机必须装sim卡;
- 利用微信的视频通话功能,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系统设置的辅助服务里打开,可以说是很安全了。
自此,一个安全简易的监控实现完成,本文仅供实践学习参考。