zoukankan      html  css  js  c++  java
  • Android AccessibilityService(辅助服务) 使用示例

    1、前言

    网上关于Android辅助服务的使用方式已经非常丰富了,所以也不在乎再多我这一篇了:-D。有同学说这是重复造轮子,题主很同意,但反过来说,如果自己没有能力造出轮子,还对重复造轮子嗤之以鼻,那……,再者,题主认为,自己重复一遍别人的轮子,踩踩坑,要比只看别人的轮子在理解上深刻的多,再不济,记录下来权当笔记吧

    2、实现步骤

    1、自定义服务继承系统的AccessibilityService服务,重写必要方法

    2、配置AndroidManiFest.xml,增加服务相关配置

    3、在res下新建文件夹xml,新建xml文件,配置服务的相关配置,并在AndroidManifest.xml指定该配置文件(也可以在服务类的onServiceConnected中配置)

    4、打包、安装apk,在“设置里”找到辅助服务并开启即可。

    3、具体实现

    1、自定义服务,必须实现的方法是onAccessibilityEvent(AccessibilityEvent event)和onInterrupt(),代码如下

    public class AccessibilityServiceTest extends AccessibilityService {
    
        //可在此方法中配置服务的相关配置,代替配置文件的方式
        @Override
        protected void onServiceConnected() {
            super.onServiceConnected();
            Log.d("XLZH:", "OnServiceConnected");
        }
        
        //监听事件类型,根据事件类型不同做不同的处理。事件类型较多,各位可以打印出来筛选出来自己要监听的事件类型
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {
            Log.d("XLZH:", event.toString());
            int eventType = event.getEventType();
            switch (eventType) {
                case AccessibilityEvent.TYPE_VIEW_SCROLLED:
                    //获取发生该事件的页面根view
                    AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
                    //根据id查找需要点击的节点,返回的是一个List
                    List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId("com.tendcloud.demo:id/pager");
                    //获取List的第一个节点,并打印该节点的child数目及类名
                    AccessibilityNodeInfo contentNodeInfo = list.get(0);
                    Log.d("XLZH size:", String.valueOf(contentNodeInfo.getChildCount()));
                    Log.d("XLZH class: ", String.valueOf(contentNodeInfo.getClassName()));
    
                    //通过查找文本的方式获得节点  
    if(contentNodeInfo.findAccessibilityNodeInfosByText("button_test1") != null){
    Log.d("XLZH :", "first page"); } if(contentNodeInfo.findAccessibilityNodeInfosByText("button1") != null){ Log.d("XLZH :", "second page"); } if(contentNodeInfo.findAccessibilityNodeInfosByText("tvweb") != null){ Log.d("XLZH :", "third page"); } break; } } @Override public void onInterrupt() { } }

    2、配置AndroidManiFest.xml。如下

            <service
                android:name=".AccessibilityServiceTest"
                android:label="AccessibilityServiceTest"
                <!--声明权限,而不是申请权限-->            
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" android:exported="false">
    <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <!--配置服务服务配置文件路径--> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_xml" /> </service>

    3、编写辅助服务的配置文件

    <?xml version="1.0" encoding="utf-8"?>
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/description"          //在设置中显示的内容
        android:accessibilityEventTypes="typeAllMask"   //监听事件的类型
        android:accessibilityFeedbackType="feedbackGeneric" //反馈的类型
        android:notificationTimeout="100"                    //设置超时时间
        android:accessibilityFlags="flagDefault"             //配置flag
        android:canRetrieveWindowContent="true"        //可以获取窗口上的对象的值
        android:packageNames="com.tendcloud.demo" /> //配置要监听的包名

    4、其他

    1、有个印象深刻的坑是在配置AndroidManifest.xml时,不是使用<user-permission ...>,而是要在Service里声明服务,即有BIND_ACCESSIBILITY_SERVICE的应用才能访问该服务,而不是该服务需要申请这个权限

    2、本来想是否可以只要该Service,而不要Activity,经过查阅资料、亲自尝试,结果是……不行!

    3、还有一个坑,至今没有解决。测试的目的apk界面, 如下

    如代码所示,本来想通过查找控件确定当前是那个页面,测试结果发现当在第一个页面的时候,Child包括第二个页面中的控件,当在第二个页面的时候,Child包括第一个、第二、第三个页面中的控件,当在第三个页面的时候,Child包括第二个页面和第三个页面中的控件。

    具体原因不明白,有大神可以测试并指导一下,谢谢。

    测试对象apk

    测试代码

  • 相关阅读:
    关于oracle分页出现数据重复的问题
    VSCode如何配置中文环境
    POI导出excel执行自动求和
    IE浏览器不支持document.getElementsByClassName的解决办法
    原生JavaScript实现切换tab显示不同的样式
    easyUI日期控件只选择月份和日期
    POI导出Excel的两种方法
    python Django 学习笔记(四)—— 使用MySQL数据库
    python Django 学习笔记(三)—— 模版的使用
    python Django 学习笔记(二)—— 一个简单的网页
  • 原文地址:https://www.cnblogs.com/gordon0918/p/6641272.html
Copyright © 2011-2022 走看看