原文: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)。

如何使用好android的可访问性服务(Accessibility Services)的更多相关文章

  1. web标准的可用性和可访问性

    在Web前端开发界,有三个词经常被提及:可用性(Usability).可访问性(Accessibility)和可维护性(Maintainability). 可用性指的是:产品是否容易上手,用户能否完成 ...

  2. Grnymotion模拟器和Android真机访问PC端Tomcat下的应用

    最近因为要学安卓与服务器交互的知识,所以必须要让android程序能访问一个测试服务器.所以我就考虑让真机或者模拟器访问PC端的Tomcat或者Apache服务. 在介绍步骤之前,有必要说点基础的.我 ...

  3. 使用 CSS perfer-* 规范,提升网站的可访问性与健壮性

    文本将介绍 CSS 媒体查询中新增的几个特性功能: prefers-reduced-motion prefers-color-scheme prefers-contrast prefers-reduc ...

  4. go:结构体的可访问性

    1.要使某个符号对其他包( package)可见(即可以访问),需要将该符号定义为以大写字母开头------摘自go相关书籍2.go只限制包内外的可访问性,而不限制同包内不同文件的可访问性 本文讨论结 ...

  5. AChecker + Selenium2对需要登录的页面进行自动化可访问性测试

    前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力.   名词解释: 网站可访问性测试:国内基本没有 ...

  6. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  7. 对Web标准的理解。可用性和可访问性

    一Web标准 简单的说,就是HTML.CSS.JavaScript这三者分离.WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentat ...

  8. 可访问性级别的C# 修饰符

    使用访问修饰符 public.protected.internal 或 private 可以为成员指定以下声明的访问级别之一. http://keleyi.com/a/bjad/3ccfqh95.ht ...

  9. 《Effective Java》笔记 使类和成员的可访问性最小化

    类和接口 第13条 使类和成员的可访问性最小化 1.设计良好的模块会隐藏所有的实现细节,把它的API与实现清晰的隔离开来,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况: ...

随机推荐

  1. 索引全扫描(INDEX FULL SCAN)

    所谓的索引全扫描(INDEX FULL SCAN)就是指要扫描目标索引所有叶子块的所有索引行.这里需要注意的是,索引全扫描需要扫描目标索引的所有叶子块,但这并不意味着需要扫描该索引的所有分支块.在默认 ...

  2. 【DB2】清理日志文件db2diag.log

    在数据库运行过程中,会产生很多的日志,进而使日志文件db2diag.log变大 当占用磁盘空间太大的时候,应该怎么处理呢? 方法一: db2inst1@Linux:/db2home/db2inst1/ ...

  3. 转:Ogre源码分析之Root类、Facade模式

    Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...

  4. Web 进化

    来源于:http://xitu.github.io/2016/05/11/history-of-web/ 传统后台架构 上古时代 上古时代 123456789101112131415161718192 ...

  5. CSVWriter生成文件时writer.writeRecord();方法保存的文件末尾多一个空行

    一.问题,CSVWriter生成文件时使用writer.writeRecord();方法保存的文件末尾多一个空行,效果图如下: 目标结果:(去掉末尾空行) 二.关键代码如下(修改前代码): /** * ...

  6. git difftool 详解

    一.如何比较两个版本之间的差异 1.显示版本得到版本的commit id 2.执行difftool命令 按Y进行比较,我用的是DiffMerge这个软件对代码进行比较的 二.比较当前所修改的内容 gi ...

  7. warning C4005 DXGI_STATUS_OCCLUDED

    注意包含顺序 要将 $(DXSDK_DIR)Include放在后面才行 $(VC_IncludePath)$(WindowsSDK_IncludePath)$(DXSDK_DIR)Include 为了 ...

  8. Effective Tensorflow[转]

    Effective TensorFlow Table of Contents TensorFlow Basics Understanding static and dynamic shapes Sco ...

  9. java struts2入门学习实例--使用struts2快速实现上传

    一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...

  10. MySQL高可用性大杀器之MHA

    MySQL高可用性大杀器之MHA   提到MySQL高可用性,很多人会想到MySQL Cluster,亦或者Heartbeat+DRBD,不过这些方案的复杂性常常让人望而却步,与之相对,利用MySQL ...