• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android AccessibilityService应用留意

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0917/645.html

 
AccessibilityService简介
手机App外包简介
 
AccessibilityService是一个辅助类,可以监听我们手机的核心,窗口变更,按钮点击等等。实现它的服无需求在手机配置内部->辅助功效在这内部找到你本人实现的辅助类,而后翻开它便进行我们一系列的监听了。还可以对监听的工具进行少许剧本的操纵。
 
 
 
配置
Manifest.xml配置
新建一个类秉承AccessibilityService,并在AndroidManifest文件里注册它,加入对应的Intent-filter,表明是一个辅助服无,同时加入响应的权限.
 
<application>
<service android:name=".MyAccessibilityService" android:label="@string/accessibility_service_label">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
</service>
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
</application>
 
 
配置辅助服无
在代码中配置
普通在onServiceConnected()方式里进行
 
private void setServiceInfo(int feedbackType) {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
// We are interested in all types of accessibility events.
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
// We want to provide specific type of feedback.
info.feedbackType = feedbackType;
// We want to receive events in a certain interval.
info.notificationTimeout = EVENT_NOTIFICATION_TIMEOUT_MILLIS;
// We want to receive accessibility events only from certain packages.
info.packageNames = PACKAGE_NAMES;
setServiceInfo(info);
}
在xml文件中配置
从Android4.0开始,App开发培训开发者可以通过在AndroidManifest里增加标签
 
<service android:name=".MyAccessibilityService">
...
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
 
 
配置实现类
子类MyAccessibilityService秉承AccessibilityService,并实现响应的重载方式:
 
方式
形貌
onServiceConnected() 可选。体系会在胜利持续上你的服无的时候挪用这个方式,在这个方式里你可以做一下初始化事情,比方建筑的声响触动经管,也能够挪用setServiceInfo()进行配置事情
onAccessibilityEvent() 通过这个函数可以汲取体系发送来的AccessibilityEvent,汲取来的AccessibilityEvent是经过过滤的,过滤是在配置事情时配置的。
onInterrupt() 必需。这个在体系想要中缀AccessibilityService返给的响应时会挪用。在全部性命周期里会被挪用屡次。
onUnbind() 可选。在体系将要关闭这个AccessibilityService会被挪用。在这个方式中进行少许释放资源的事情
实操
onAccessibilityEvent()中对事件进行监听挑选
 
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:  //收到关照栏消息
break;
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:    //界面状况改变
break;
case  AccessibilityEvent.TYPE_VIEW_CLICKED:   //点击事件
break;
case AccessibilityEvent.CONTENT_CHANGE_TYPE_TEXT: //文本改变
break;
//不祥其余的一堆可以监听的事件
}
}
获取目前常州网站开发培训界面种种资源,信息
 
//获取根节点
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
//般配Text获取节点
List<AccessibilityNodeInfo> list1 = rootNode.findAccessibilityNodeInfosByText("match_text");
//般配id获取节点
List<AccessibilityNodeInfo> list2 = rootNode.findAccessibilityNodeInfosByViewId("match_id");
//获取子节点
AccessibilityNodeInfo infoNode = rootNode.getChild(index);
执行剧本操纵
 
//模拟点击事件
target.performAction(AccessibilityNodeInfo.ACTION_CLICK);
//模拟输入内容
clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "");
clipboard.setPrimaryClip(clip);
target.performAction(AccessibilityNodeInfo.ACTION_PASTE);
模拟Home,Back键
 
//后退键
performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
//Home键
performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
//模拟左滑
performGlobalAction(AccessibilityService.GESTURE_SWIPE_LEFT);
抢红包思绪
1.监听微信运用发出的Notification,搜检字段是否有“微信红包”字段;
2.点击Notification,进入微信界面
3.挪用getRootInActiveWindow()获取根节点;
4.挪用findAccessibilityNodeInfosByText(“领取红包”),获取该节点
5.挪用performAction(AccessibilityNodeInfo.ACTION_CLICK)实现模拟点击
坑点
1.包被殽杂,以前通过Android Device Monitor查看ID,而后凭据findAccessibilityNodeInfosByID()去般配节点,包被殽杂以后每个版本不同样
2.很难找出没有文本的控件,如EditText,ImageView
private void findEditText(AccessibilityNodeInfo root) {
if (root.getClassName().equals("android.widget.EditText")) {
target = root;
} else {
for (int i = 0; i < root.getChildCount(); i++) {
if (root.getChildCount() != 0) {
findEditText(root.getChild(i));
}
}
}
}
3.锁屏抢红包要解除锁屏,isKeyguardLocked()方式错误明白。刚开始写代码的时候默认检验是否有锁屏,要是锁屏了挪用disableKeyguard(),解锁,而后再检验是否真正解锁,胜利解锁以后再进行抢红包的逻辑。背面发现disableKeyguard()并不是真正能够解锁,只是潜藏了锁屏。
km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
//获得锁经管器工具
boolean flag = km.isKeyguardLocked();
isFromNotification = true;
if (flag == true) {
kl = km.newKeyguardLock("unLock");
kl.disableKeyguard();
}
gotoWeCharUI(event);
 
 
官方对disableKeyguard()企业培训注释: 
* Disable the keyguard from showing. If the keyguard is currently 
* showing, hide it. The keyguard will be prevented from showing again 
* until {@link #reenableKeyguard()} is called.
 

上篇:上一篇:微信小程序wx.getImageInfo碰到的坑
下篇:下一篇:(AccessibilityService)Android辅助功效条记