Building Accessibility Services

无障碍服务是提供的增强用户界面,帮助用户残疾,或者谁可能暂时无法与设备完全交互的应用程序。例如,用户谁在开车,采取一个年轻的孩子照顾或参加一个非常响亮的党可能需要额外或替代界面的反馈。
Android提供了标准的辅助服务,包括话语提示,并且开发人员可以创建和发布自己的服务。本文档介绍了构建无障碍服务的基本知识。
构建和部署无障碍服务的能力,你是与Android 1.6(API等级4)推出,与Android 4.0(API等级14)收到显著的改善。 Android的支持库也与Android 4.0的发布更新,以提供支持,这些增强的辅助功能回到了Android 1.6。瞄准广泛兼容的无障碍服务开发者鼓励使用支持库和发展中的Andr​​oid 4.0引入了更先进的辅助功能。
清单声明和权限
提供无障碍服务必须在其应用程序清单的具体声明应用被视为由Android系统的辅助服务。本节介绍无障碍服务的必需和可选设置。
无障碍服务声明
为了作为一种辅助服务来处理,你必须在你的清单中应用程序元素中的一个服务元素(而不是活性元素)。此外,服务元素内,还必须包括辅助服务的意图过滤器。对于Android 4.1及更高的兼容性,清单还必须要求如下例所示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>    <action android:name="android.accessibilityservice.AccessibilityService" />   </intent-filter>  </service>  <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> </application></manifest>
这些声明都需要部署在Android1.6(API等级4)或更高版本的所有无障碍服务。
辅助服务配置
无障碍服务还必须提供一个配置,它指定的类型服务的无障碍处理事件和有关服务的附加信息。无障碍服务的配置包含在AccessibilityServiceInfo类。您的服务可以构建和使用此类在运行时和getServiceInfo()的一个实例设置的配置。然而,并非所有的配置选项可使用此方法。
与Android4.0开始,可以包含一个<元数据>元素在你的清单与参考配置文件,它允许你设置全方位的您的无障碍服务选项,如下面的例子:

<service android:name=".MyAccessibilityService"> ... <meta-data  android:name="android.accessibilityservice"  android:resource="@xml/accessibility_service_config" /></service>
该元数据元指的是你在你的应用程序的资源目录下创建(<PROJECT_DIR>/res/xml/accessibility_service_config.xml)的XML文件。下面的代码显示了服务配置文件示例内容:

<accessibility-service xmlns: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"  android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"/>
有关可在辅助服务配置文件中使用的XML属性的更多信息,请点击这些链接的参考文档:

  • android:description
  • android:packageNames
  • android:accessibilityEventTypes
  • android:accessibilityFlags
  • android:accessibilityFeedbackType
  • android:notificationTimeout
  • android:canRetrieveWindowContent
  • android:settingsActivity
有关哪些配置设置可以动态地在运行时设置的详细信息,请参阅AccessibilityServiceInfo参考文档。


注册为辅助活动


其中一个辅助服务配置参数的最重要的功能就是让您指定服务可以处理哪些类型的可访问性事件。能够指定此信息使无障碍服务相互合作,并允许你作为一个开发人员能够灵活地处理来自特定应用程序仅限于特定的事件类型。事件过滤可以包括以下标准:


软件包名称 - 指定您希望您的服务来处理其辅助活动的应用程序包名称。如果省略该参数,您可访问服务被认为是可用于服务的任何应用程序可访问性事件。此参数可与机器人的辅助服务配置文件进行设置:packageNames属性作为一个逗号分隔的列表,或使用AccessibilityServiceInfo.packageNames成员设置。
事件类型 - 指定类型的你希望你的服务来处理可访问性事件。此参数可与机器人的辅助服务配置文件进行设置:accessibilityEventTypes属性由|分隔的列表字符(例如accessibilityEventTypes =“typeViewClicked | typeViewFocused”),或者使用AccessibilityServiceInfo.eventTypes构件设置。
在设置无障碍服务,仔细考虑什么事件您服务是能够处理,只有注册的事件。由于用户可以同时激活多个可访问的服务,服务必须不消耗事件,这是不能够处理。请记住,其他服务可以处理这些事件,以便提高用户的体验。


注意:Android框架调度无障碍事件到多个辅助服务,如果服务提供了不同的反馈类型。然而,如果两个或更多的服务提供相同的反馈类型,则仅在第一注册服务接收的事件。


AccessibilityService方法


无障碍服务必须扩展AccessibilityService类并覆盖从该类下面的方法。这些方法在它们被Android系统调用,从当服务启动的顺序呈现(onServiceConnected()),而它正在运行(onAccessibilityEvent(),onInterrupt()),当它被关闭,(onUnbind ())。


onServiceConnected() - (可选)该系统调用此方法时,它成功地连接到您的无障碍服务。使用此方法做任何一次性设置步骤为您服务,包括连接到用户反馈系统服务,如音频管理器或设备振动。如果您想您的服务设置的配置在运行时或进行一次性调整,这是从中调用setServiceInfo()的便利位置。
onAccessibilityEvent() - 当它检测到事件过滤你的无障碍服务指定的参数相匹配的AccessibilityEvent(必需的)这种方法被称为回用系统。例如,当用户点击一个按钮,或侧重于为其您的无障碍服务提供反馈的应用程序的用户界面控制。发生这种情况时,系统调用这个方法,传递相关的AccessibilityEvent,该服务就可以解释和使用提供反馈给用户。此方法可能会在你的服务的生命周期中被调用多次。
onInterrupt() - (必需)此方法是当系统要中断的服务被提供,通常是在响应于用户操作,如移动聚焦到不同的控制的反馈调用。此方法可能会在你的服务的生命周期中被调用多次。
onUnbind() - 当系统即将关闭辅助服务(可选)该方法被调用。使用此方法做任何一次性的关机程序,包括取消分配用户反馈系统服务,如音频管理器或设备振动。
这些回调方法为您的无障碍服务提供的基本结构。它是由你来如何处理由Android系统在AccessibilityEvent对象的形式提供的数据,并为用户提供的反馈决定。有关从事件无障碍获取信息的详细信息,请参阅实施辅助训练。


获取活动详情


Android系统提供的信息约通过AccessibilityEvent对象用户界面交互无障碍服务。到Android 4.0,在一个可访问事件中可用的信息,同时提供关于由用户选择的用户接口控制细节的显著量之前,提供了有限的上下文信息。在许多情况下,这种缺失的上下文信息可能是对理解所选择的控制的含义是至关重要的。


处的接口上下文是关键的一个例子是一个日历或日程安排。如果用户在周一至周五白天列表中选择一个4:00 PM时隙和辅助服务宣布“4 PM”,但并没有公布星期名称,该月的一天或每月的名字,得到的反馈令人困惑。在这种情况下,用户接口控制的上下文中是谁想要安排会议用户的关键。


Android 4.0的显著扩展的信息无障碍服务可以获取有关通过组合基于视图层次的无障碍活动的用户界面交互量。视图层级是一组包含组分(其父母),并可以由该组件(其子)被包含在用户接口元件的用户界面组件。这样一来,Android系统可以提供更丰富的细节有关辅助活动,使无障碍服务提供更多有用的反馈给用户。


无障碍服务通过系统传递给服务的onAccessibilityEvent()回调方法的AccessibilityEvent获取关于一个用户界面的事件信息。此对象提供有关事件的详细信息,包括所操作的对象的类型,它的说明性文字和其他细节。在Android 4.0的(并且通过在支持库的AccessibilityEventCompat对象支持在以前的版本)开始,您可以获取有关使用这些电话事件的附加信息:


AccessibilityEvent.getRecordCount()和getRecord(INT) - 这些方法允许您检索一套促成AccessibilityEvent传递给你的系统AccessibilityRecord对象。这种详细程度为触发您的无障碍服务事件的详细内容。
AccessibilityEvent.getSource() - 这个方法返回一个AccessibilityNodeInfo对象。这个对象允许您请求视图布局层次(父母和子女)发起的辅助事件的组件。此功能允许无障碍服务,调查事件的完整的上下文,包括任何封闭视图或子视图的内容和状态。
重要提示:调查视图层次从AccessibilityEvent可能暴露私人用户信息的无障碍服务的能力。出于这个原因,你的服务必须要求这个层面通过辅助服务XML配置文件的访问,通过包括canRetrieveWindowContent属性并将其设置为true。如果不包括在服务配置XML文件此设置,调用的getSource()失败。


注:在Android 4.1(API等级16)和更高的的getSource()方法,以及AccessibilityNodeInfo.getChild()和的getParent()返回被认为是重要的辅助功​​能只能查看对象绘制的内容或响应(意见用户操作)。如果您的服务要求所有的意见,可以通过设置该服务的AccessibilityServiceInfo实例FLAG_INCLUDE_NOT_IMPORTANT_VIEWS的标志成员提出要求。


采取行动的用户


采用Android 4.0(API级别14)开始,无障碍服务可以代表用户,包括改变输入焦点和选择(激活)​​的用户界面元素。在搭载Android 4.1(API等级16)行动的范围已经扩大到包括滚动列表和文本字段进行交互。无障碍服务也可以采取全球行动,比如导航到主屏幕,按后退按钮,打开屏幕的通知和最近的应用程序列表。搭载Android 4.1还包括一个新型的焦点,聚焦平易,这使得由辅助服务可选择所有可见的元素。


这些新功能有可能使的无障碍服务开发人员能够创建替代导航模式,如手势导航,并为用户提供残疾人改善他们的Andr​​oid设备的控制。


听力手势


辅助服务可以侦听特定的手势,并采取代表用户的操作作出响应。此功能,添加了搭载Android 4.1(API等级16),并要求由触控功能的浏览您的无障碍服务请求激活。服务可以通过设置该服务的AccessibilityServiceInfo实例的标志件FLAG_REQUEST_TOUCH_EXPLORATION_MODE所示,下面的示例请求该活化

public class MyAccessibilityService extends AccessibilityService {  @Override  public void onCreate() {    getServiceInfo().flags = AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;  }  ...}
一旦你的服务请求通过触摸浏览的激活,用户必须允许该功能开启,如果是尚未激活。当该功能被激活,你的服务,通过服务的onGesture()回调方法接收无障碍手势通知,并可以通过采取措施,为用户做出响应。


使用辅助行动


无障碍服务可以代表用户的行动,使与应用程序更简单,更高效的互动。在Android 4.0的(API等级14),并采用Android 4.1(API等级16)显著扩大,加入的无障碍服务执行操作的能力。


为了充分代表用户的操作,您的无障碍服务,必须注册才能接收来自几个或多个应用程序,并要求允许事件被Android设置来查看应用程序的内容:服​​务配置文件中canRetrieveWindowContent为true。当事件由服务接收,它就可以从事件中使用的getSource检索AccessibilityNodeInfo对象()。随着AccessibilityNodeInfo对象,你的服务的话,可以探索视图层次结构来决定采取何种行动,然后使用行为的performAction为用户()。

public class MyAccessibilityService extends AccessibilityService {  @Override  public void onAccessibilityEvent(AccessibilityEvent event) {    // get the source node of the event    AccessibilityNodeInfo nodeInfo = event.getSource();    // Use the event and node information to determine    // what action to take    // take action on behalf of the user    nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);    // recycle the nodeInfo object    nodeInfo.recycle();  }  ...}
performAction的()方法可以让你的服务在应用程序中采取行动。如果您的服务需要执行的全球行动,如导航到主屏幕,按后退按钮,在打开的通知屏幕或最近的应用程序列表中,然后使用performGlobalAction()方法。


使用对焦类型


搭载Android 4.1(API等级16)引入了一种新类型的用户界面焦点称为辅助对焦。这种类型聚焦可通过辅助服务用于选择任何可见的用户界面元素并采取行动。这种对焦方式是比较知名的输入焦点,这就决定了屏幕上的用户界面元素接收输入什么,当用户键入的字符,按下回车键在键盘上或推一个D垫控制的中央按钮不同。


辅助对焦是完全从输入焦点分离和独立。实际上,有可能用于在用户界面中的一个元件具有输入焦点,而另一个元件具有辅助聚焦。辅助聚焦的目的在于提供辅助服务,在屏幕上的任何可见的元件相互作用,无论该元素是否是从系统角度输入可聚焦的方法。您可以通过测试工具手势见无障碍重点行动。有关测试该功能的详细信息,请参阅测试手势导航。


注意:使用辅助对焦辅助服务负责当元素支持这种类型的焦点的同步电流输入焦点。不输入焦点配备无障碍对焦同步服务运行造成意想不到输入焦点是在一个特定的位置时,采取某些行动应用程序出现问题的风险。


无障碍服务可以决定哪些用户界面元素具有输入焦点或使用AccessibilityNodeInfo.findFocus()方法辅助对焦。您也可以搜索可使用focusSearch()方法输入焦点被选中的元素。最后,您的辅助服务可使用的performAction(AccessibilityNodeInfo.ACTION_SET_ACCESSIBILITY_FOCUS)方法设置辅助对焦。


示例代码


该API演示项目包含可以作为一个起点,产生无障碍服务(<SDK> /样本/ <平台> / ApiDemos / src目录/ COM /例子/安卓/的API /辅助)两个样本:


ClockBackService - 该服务是在原有基础上实现AccessibilityService的,可作为开发符合了Android 1.6(API级别4)和更高版本兼容的基本辅助服务基地。
TaskBackService - 该服务是基于Android 4.0的(API等级14)推出的增强型辅助功能的API。但是,您可以使用Android的支持Libary替代在以后的API级别(例如,AccessibilityRecord,AccessibilityNodeInfo)具有同等的支持包类引入类(如AccessibilityRecordCompat,AccessibilityNodeInfoCompat),以与API版本返回到Android 1.6这个例子中工作(API 4级)。

更多相关文章

  1. Android下Socket简单通信+Python服务器
  2. Android(安卓)一文学会无障碍服务(AccessibilityService)
  3. Android(安卓)对用户名密码进行加密操作存储在本地
  4. Android多进程间采用AIDL方式进行通信简单DEMO
  5. Android全局异常处理(捕获异常,不弹出程序崩溃)
  6. 我理解的 iOS 与 Android(安卓)的区别
  7. Android(安卓)客户端与服务器端进行数据交互(一、登录服务器端)
  8. android——截屏共享的坑,mmp
  9. Android基于XMPP Smack Openfire开发IM(1)搭建openfire服务器

随机推荐

  1. 2021年11月9日作业1
  2. 樱花怎么画?超详细樱花画法步骤!
  3. 用户注册作业
  4. 2021.11.9 作业
  5. 大前端第二天第一个作业
  6. HTML 练习
  7. Vue介绍及Vue脚手架安装
  8. 11月9日 走进HTML的世界
  9. ES6基本语法,Axios异步网络请求介绍
  10. 前端基础,HTML5常用标签学习总结