AccessibilityService实现自滚动指定条目实现点击效果

AccessibilityService实现自滚动指定条目实现点击效果

2023年6月27日发(作者:)

AccessibilityService实现⾃滚动指定条⽬实现点击效果AccessibilityService 实现⾃滚动指定条⽬实现点击效果⾸先AccessiblityService 作为在Android Setting设置中的⼀个辅助服务,在后台运⾏并接收系统AccessibilityEvents事件的回调,它开启后能够实现⼿机窗⼝状态和事件的监听,包含各种点击 、触摸和内容的变化切换等。这⾥只是实现Setting中开发者选项的⾃滚动到布局边界实现⾃点击效果1. 配置清单⽂件 2. 在res/xml/accessbility_service_ 中配置AccessibilityServices 属性配置android:accessibilityEventTypes:这个属性设置服务只接收的事件类型。android:packageNames能够配置只监听的包名,不配置则是全部监听事件类型(EventType): #TYPES_ALL_MASK:所有类型 #TYPE_VIEW_CLICKED :单击 #TYPE_VIEW_LONG_CLICKED :长按 #TYPE_VIEW_SELECTED :选中 #TYPE_VIEW_FOCUSED :获取焦点 #TYPE_VIEW_TEXT_CHANGED :⽂字改变 #TYPE_WINDOW_STATE_CHANGED :窗⼝状态改变 #TYPE_NOTIFICATION_STATE_CHANGED :通知状态改变 #TYPE_VIEW_HOVER_ENTER #TYPE_VIEW_HOVER_EXIT #TYPE_TOUCH_EXPLORATION_GESTURE_START #TYPE_TOUCH_EXPLORATION_GESTURE_END #TYPE_WINDOW_CONTENT_CHANGED #TYPE_VIEW_SCROLLED #TYPE_VIEW_TEXT_SELECTION_CHANGED #TYPE_ANNOUNCEMENT #TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY #TYPE_GESTURE_DETECTION_START #TYPE_GESTURE_DETECTION_END #TYPE_TOUCH_INTERACTION_START #TYPE_TOUCH_INTERACTION_END #TYPE_WINDOWS_CHANGED3. 继承AccessibilityService并实现其中的抽象⽅法。public class AccessibilityPermissionServices extends AccessibilityService { private static final String TAG = pleName(); private boolean isOpen=false;//防⽌开启后多次点击 /** *

页⾯变化回调事件 * @param event ntType()

当前事件的类型; * ssName()

当前类的名称; * rce()

当前页⾯中的节点信息; * kageName()

事件源所在的包名 */ @Override public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow(); //获取当前展⽰的窗⼝ if (rootInActiveWindow!=null){//查找⾃滚动到开发⼈员选项中的显⽰布局边界点击开关 //开发⼈员选项 List devInfos =rootInActiveWindow .findAccessibilityNodeInfosByText(getString(_developers_debug)); if (devInfos!=null &&()>0 ){ //显⽰布局边界 scrollDeveloperCllick(getString(_show_layout), "android:id/switch_widget",rootInActiveWindow); } } }

/** *

滑动直到控件显⽰后,触发点击事件 * * @param text

查找的控件显⽰的内容 * @param listId

滚动的容器id */ public void scrollDeveloperCllick(String text, String listId, AccessibilityNodeInfo rootInActiveWindow) { if (rootInActiveWindow != null) { List item = cessibilityNodeInfosByText(text); //根据关键字查找某控件元素 List list = cessibilityNodeInfosByViewId(listId); //根据resource id

查找容器元素;判断关键字查找出的元素是否在该容器元素中; if (item == null || () == 0) { //

关键字元素不存在,则滚动容器元素 LogUtils.D(TAG, "不存在 " + text); if (list != null && () > 0) { LogUtils.D(TAG, "---- [ " + text + " ] 滚动查找中 ----" + ()); AccessibilityNodeInfo parent = (0).getParent().getParent(); if (parent!=null){ LogUtils.D(TAG, "---- 滚动 ----" + (0).getParent().getParent().isScrollable()); for (int i = 0; i < (); i++) { if (mAction(_SCROLL_FORWARD)) { scrollDeveloperCllick(getString(_show_layout), "android:id/switch_widget",rootInActiveWindow); isOpen=true; } return; } } } } else { LogUtils.D(TAG, "ACTION_CLICK text1=" +",item="+()); if (list!=null){ for (int i = 0; i < (); i++) { String s = (i).getParent().getChild(0).getText().toString(); LogUtils.D(TAG, "ACTION_CLICK text1=" +s!=null?s:null); if (!y(s) && (text)&&isOpen){ (i) .performAction(_CLICK); isOpen=false; break; } } } } } }}4. AccessibilityService⾥⼏个重要的⽅法:onServiceConnected() -可选。系统会在成功连接上你的服务的时候调⽤这个⽅法,在这个⽅法⾥你可以做⼀下初始化⼯作,例如设备的声⾳震动管理,也可以调⽤setServiceInfo()进⾏配置AccessibilityServiceInfo。onAccessibilityEvent() -必须。通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置⼯作时设置的。onInterrupt() -必须。这个在系统想要中断AccessibilityService返给的响应时会调⽤。在整个⽣命周期⾥会被调⽤多次。 onUnbind() -可选。在系统将要关闭这个AccessibilityService会被调⽤。在这个⽅法中进⾏⼀些释放资源的⼯作。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687841689a49962.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信