AccessibilityService 用法详解及案例

AccessibilityService                                                                                                                        Addedin API level 4

java.lang.Object
   ↳      android.content.Context
         ↳      android.content.ContextWrapper
               ↳      android.app.Service
                    ↳      android.accessibilityservice.AccessibilityService 

简介(蹩脚的翻译):

      无障碍服务旨在帮助残疾人使用Android设备和应用程序。它们在后台运行,当系统被触发时接收系统的回调。这样的事件表示用户界面中的一些状态转换,例如,焦点已经改变,按钮被点击等。这样的服务可以可选地请求查询活动窗口的内容的能力。可访问性服务的开发需要扩展该类并实现其抽象方法。

个人的一点理解:AccessibilityService是Google旨在帮助某些方面有障碍的人(比如聋哑或视力障碍),当AccessibilityService在手机上打开时,确保音频提示总是伴随另一个视觉提示或通知,这会使应用程序有更好的体验。它可以让你模拟点击事件、输入文本、列表滚动等,组合起来可以做些有趣的事儿,比如做一个伪小机器人让它做一连串操作,类似PC端的按键精灵。

一、AccessibilityService 的用法

1、继承AccessibilityService,需实现两个方法

①onAccessibilityEvent(),当用户界面发生变化时(比如模拟点击按钮、输入文本等),就会将事件传到此处,就可以做相应操作

②onInterrupt(),服务被中断的回调

public class MyAccessibilityService extends AccessibilityService{

    public void onAccessibilityEvent(AccessibilityEvent event){
    }
    public void onInterrupt() {
    }
}

2、在清单文件中注册

AccessibilityService 的应用程序必须在其应用程序清单中包含特定的声明,以将其视为Android系统的可访问性服务

注:对于与Android 4.1和更高的兼容性,清单还必须请求android.permission.BIND_ACCESSIBILITY_SERVICE权限

<manifest>
  ...
  <uses-permission ... />
  ...
  <application>
    ...
    <service android:name=".MyAccessibilityService"
       android:label="@string/accessibility_service_label"
       android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
      <intent-filter>
        <actionandroid:name="android.accessibilityservice.AccessibilityService"/>
      </intent-filter>

    </service

  <uses-permissionandroid:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />

  </application>

</manifest>

3、AccessibilityService 必须提供一种配置,该配置指定服务处理的事件的类型和关于服务的附加信息。

可访问性服务的配置包含在AccessibilityServiceInfo类中,服务可以在运行时使用该类的实例和setServiceInfo() 设置和设置配置。但是,并非所有配置选项都可用此方法设置。

在应用程序的资源目录中创建的XML文件,

①创建app/src/main/res/xml/accessibility_service_config

<accessibility-servicexmlns:android="http://schemas.android.com/apk/res/android"
   android:description="@string/accessibility_service_description"
    android:packageNames="com.example.android.apis"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagDefault"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"

    android:canRetrieveWindowContent="true"/>

常用属性解释:

-description 用户允许应用的辅助功能的说明字符串

-accessibilityEventTypes:表示该服务对界面中的哪些变化感兴趣,即哪些事件通知,比如窗口打开,滑动,焦点变化,长按等.具体的值可以在AccessibilityEvent类中查到,如typeAllMask表示接受所有的事件通知.
-accessibilityFeedbackType:表示反馈方式,比如是语音播放,还是震动
-canRetrieveWindowContent:表示该服务能否访问活动窗口中的内容.也就是如果你希望在服务中获取窗体内容的化,则需要设置其值为true
-notificationTimeout:接受事件的时间间隔,通常将其设置为100即可
-packageNames:表示对该服务是用来监听哪个包的产生的事件

②引用

<service android:name=".MyAccessibilityService">

  ...
  <meta-data
    android:name="android.accessibilityservice"
    android:resource="@xml/accessibility_service_config" />
</service>

注:当服务启动后,会调用onServiceConnected(),所以当你需要初始化一些数据时,可以在这里进行

设置-辅助功能-需要手动开启,毕竟要考虑安全问题。


二、说好的案例

1、先上图

2、demo地址:

https://github.com/YanChenYuan/AccessibilityServiceTest.git


猜你喜欢

转载自blog.csdn.net/zmyhh323/article/details/80097137