如何使用好android的可访问性服务(Accessibility Services)

原文:http://android.eoe.cn/topic/android_sdk

* 主题*

Manifest声明和权限

  • 可访问性服务声明

  • 可访问性服务配置

AccessibilityService方法

获得事件细节

示例代码

  • 主要的类*

AccessibilityService

AccessibilityServiceInfo

AccessibilityEvent

AccessibilityRecord

AccessibilityNodeInfo

  • 同时要看*

Implementing Accessibility

一个可访问性服务,是一个为增强用户界面并帮助残疾用户的应用程序,或者用户可能无法完全与设备的交互。例如:用户正在开车、照顾一个小孩或者参加一个非常吵闹的聚会,那么用户就有可能需要添加额外的或者可替代的用户反馈方式。

Android提供了标准的可访问性服务,包括反馈,还有开发者可创建和发布他们自己的服务。这个文档解释了建立一个可访问性服务的基础知识。

这种构建和部署可访问性服务的技能被引入Android1.6(API级别4)并且在Android4.0(API等级14)中得到显著的改进。这个Android支持库伴随着Android4.0的发布也更新到可以提供支持以前Android1.6的增强可访问性的特性。开发者的目标是广泛兼容可访问性的服务被鼓励使用在支持库中和在Android4.0介绍更先进的可访问特性的开发。

Manifest声明和权限

提供可访问性的应用程序,为了被Android系统当作一个可访问性服务,则必须在他们的应用程序manifests文件中包含特殊的声明。这段解释了所需和可选的可访问性服务。

可访问性服务声明

为了应用程序具有可访问性服务,应用程序必须在其manifest文件中的service单元(而不是service单元中也必须包括一个可访问性服务意图的筛选程序,如下例所示:


<font

color="green">".MyAccessibilityService"
<font

color="green">"@string/accessibility_service_label">

<font

color="green">"android.accessibilityservice.AccessibilityService" />


在Android1.6(APL等级4)或者更高级中部署所有可访问性的服务都需要这些声明。

可访问性服务配置(configuration)

可访问性服务还必须提供一个,指定能够处理和添加额外信息服务的可访问事件类型的配置。这个可访问性服务的配置包含在AccessibilityServiceInfo类中。在运行的时候,你的服务可以用这个类的接口和setServiceInfo())建立并设置一个配置。然而,用这种方法不是所有的配置选项是有用的。

从Android4.0开始,你可以在你的,这样才允许你设置所有你的可访问性服务选项的完整范围,如下例所示:

".MyAccessibilityService">
...
"android.accessibilityservice"
"@xml/accessibility_service_config" />

meta-data单元引用的一个XML文件,这个文件应该创建在应用程序的resource路径(/res/xml/accessibility_service_config.xml)下面代码
展示的是服务配置文件内容的示例:



可访问性服务配置变量参数,最重要的一个功能是允许你指定你的服务程序可以处理哪种可访问性事件类型。指定这信息能够使可访问性服务相互合作,并且允许你作为开发人员灵活的处理来自特定应用程序的特定事件类型。这个事件的筛选可以含有下面的条件:
* 包的名称(Package Name)-指定包名称的应用程序,并且是需要你的服务程序处理可访问性事件的应用程序。如果这个变量参数被省略掉了,你的可访问性服务程序,服务任何应用程序的可访问事件都会被认为是可行的。这个变量参数,可以在可访问性服务配置文件里以逗号分隔列表的android:packageNames属性里设置,或者用AccessibilityServiceInfo.packageNames的成员设置。
* 时间类型(Event Types)-需要你的服务程序处理指定的可访问性事件的类型。这个参数可以在可访问性服务配置文件里以逗号分隔列表的android:accessibilityEventTypes属性里设置,或者用AccessibilityServiceInfo.eventTypes的成员设置。

更多关于可以被用在可访问性服务配置文件的XML属性信息,可以根据下面这些链接,参考相关文档。
android:description
android:packageNames
android:accessibilityEventTypes
android:accessibilityFlags
android:accessibilityFeedbackType
android:notificationTimeout
android:canRetrieveWindowContent
android:settingsActivity

更多的关于可以在运行时动态地设置配置的设置信息,可以参考AccessibilityServiceInfo文档。

AccessibilityService 方法

一个提供可访问性服务的应用程序必须继承AccessibilityService类,并且重写这个类的方法。这些方法是按从服务程序开始(onServiceConnected()))的时候这些方法(onAccessibilityEvent()), onInterrupt()))就一直运行到服务关掉(onUnbind()))的Android系统调用的顺序呈现的。

  • onServiceConnected())--(可选的)当这个方法成功连接到你的可访问性服务,系统将调用这个方法。用这个方法可以一次性的设置你的服务,包括连接到用户反馈系统服务,例如音频的管理或者设备振动器。如果你想在运行的时候设置你的服务配置或者一次性的调整,这个是很方便定位哪个服务系统调用setServiceInfo())。
  • onAccessibilityEvent())--(必须有)当这个方法检测到一个与你可访问性服务指定的事件过滤参数相匹配的可访问性事件(AccessibilityEvent)系统将调用这个方法回应。例如:在一个应用程序中,当用户点击按钮或者一个用户界面启动,你的哪个可访问性服务将提供反馈。当这种情况发生,系统将调用与AccessibilityEvent相关的服务方法,这样你才可以做出响应(interpret)并给用户提供反馈。在你的服务生命周期期间,这个方法可以被多次调用。
  • onInterrupt())--(必须有)当系统想中断你的服务系统提供的反馈,这个方法就会被调用。通常是对用户采取行动做出响应,例如:移动焦点到一个不同的用户控制界面而不是你当前提供反馈的那个界面。在你的服务生命周期期间,这个方法可以被多次调用。
  • onUnbind())--(可选的)当系统想关闭这个可访问性服务,这个方法就会被调用。用这个方法可以一次性的关闭程序 ,包括取消使用者的反馈系统服务的分配,例如:音频管理或者设备振动器。 这些回调的方法提供了你的可访问性服务的基本构架。由你决定怎样处理Android系统以AccessibilityEvent对象形式提供的数据和怎样提供给用户反馈。

获得事件的详细信息

Android系统通过AccessibilityEvent对象把关于用户界面交互的信息提供给可访问性服务。在Android4.0之前,这些有用的信息在可访问性事件中,但另一方面提供了大量有用的有关用户可选的用户界面控件的详细信息,典型的是提供了有限的上下关联信息。在许多情况下,这些缺失的前后关联的信息,对理解这些可选管理控件的含义有可能是很重要的。
在一个界面中,上下关联是至关重要的一个典型的例子是日历或日程计划。如果一个用户选择了周一到周五的“下午4点”时间列表,并且可访问性服务将通知“下午4点”,但是没有明确这是某个月的哪个周五和周一,很难将理想的信息反馈给用户。在这种情况下,对于想安排一次会议的人,这个用户界面控制的上下关联是至关重要的。

Android4.0显著地拓展了一个可访问性服务能获得有关通过基于视图底层的可访问性服务的用户界面交互的大量信息。视图分层结构可由包含组件(它的父类)的用户界面组件和可被组件(它的子类)包含的用户界面元素组成。用这个方式,Android系统可以提供更多有关允许可访问性服务提供更多有用的反馈给用户的可访问性事件的详细信息。

一个可访问性服务获取有关一个用户接口事件利用AccessibilityEvent事件通过系统向服务器请求返回一个onAccessibilityEvent())回调方法的信息 。这个可访问性服务对象提供了关于事件的详细细节。包括这个类型的对象作用,其描述文本和其他细节。从Android4.0(并且在支持库中支持以前版本的accessibilityeventcompat对象)开始,你可以获得关于事件用这些调用的额外信息:
AccessibilityEvent.getRecordCount())和getRecord(int))--这些方法允许你检索AccessibilityRecord对象集,这有助于AccessibilityEvent通过系统传递给你,这样才可以提供更多的有关可访问性服务的上下文。
AccessibilityEvent.getSource())--这方法返回一个AccessibilityNodeInfo对象。这些对象允许你索取来自可访问性事件的父类和子类组件和追查他们的内容和状态以便提供

重点:从AccessibilityEvent调查这个完整视图层次的能力可能曝光你的可访问性服务的私人用户信息。由于这个原因,你的服务必须请求这种可通过可访问性服务配置XMLservice configuration XML文件的访问级别,包括true。如果在你的服务配置xml文件中不包括此设置,将不能成功调用getSource())。

API演示项目包含两个例子,这两个例子可以作为生成可访问性服务的起点。(/samples//ApiDemos/src/com/example/android/apis/accessibility):
* AccessibilityService的实现和可以被用来作为发展基础的可访问性服务的基础,兼容安卓1.6(API级别4)和更高的。
* Support Libary) 中等效的支持包类来代替在最新的API级别中介绍的类 (例如,AccessibilityNodeInfo)。用等效的支持包类(例如, AccessibilityNodeInfoCompat)可使这个示例处理API版本兼容Android1.6(API级别4)。

原文地址:https://www.cnblogs.com/vus520/p/3152692.html