Android无障碍服务三 创建辅助功能服务

发布时间:2014-10-22 12:51:29编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Android无障碍服务三 创建辅助功能服务",主要涉及到Android无障碍服务三 创建辅助功能服务方面的内容,对于Android无障碍服务三 创建辅助功能服务感兴趣的同学可以参考一下。

4.创建辅助功能服务     一个可访问性服务是一个应用程序,这个程序提供了增强的用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们。例如,正在驾驶的用户,正照顾小孩子或参加一个非常常闹的聚会,可能需要额外的或替代的接口反馈。     Android提供了标准的辅助性服务,包括TalkBack,开发人员可以创建和分配自己的服务。该文档解释了创建辅助性服务的基本内容。     对你来讲,在Android 1.6(API4)中引入构建和部署的辅助性服务在Android 4.0(API级别14)中做了显著的改善。 Android Support Library也对Android 4.0这些增强的辅助性,Android 1.6以上版本,进行了更新,提供支持。鼓励开发人员的目标是使用Support Library,在Android 4.0介绍的更先进的辅助性特性上进行兼容辅助性服务的开发。 4.1 在Manifest声明并给出权限     提供辅助性服务的应用程序必须在其应用的manifests中当作Android系统的一个辅助性服务进行声明。本节解释了辅助性服务中必需和可选设置。 4.1.1 辅助性服务的声明     为了被当作一个辅助性服务,在应用程序的maninfest中,必须包括服务元素(而不是活动元素)。此外,在服务元素中,必须包含辅助性服务的intent filter。为了与Android 4.1以上版本的兼容性,manifest中需要指定BIND_ACCESSIBILITY_SERVICE 权限,以下示例: <application> <service android:name=".MyAccessibilityService" android:label="@string/accessibility_service_label"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> </service> <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> </application> 这些声明所需的所有辅助性服务部署在Android 1.6(API级别4)以上。 4.1.2 无障碍服务配置     辅助性性服务还必须提供一个指定辅助性服务处理事件的类型的配置和额外的信息服务。一个辅助性服务的配置是包含在AccessibilityServiceInfo类中。你的服务可以使用这个类的一个实例,在运行时setServiceInfo()来构建和设置一个配置。然而,并非所有的配置选项可以使用这种方法。从Android 4.0,您可以在你的mainifest中包含一个<meta-data>元素引用一个配置文件,它允许您为您的辅助性服务设置整个范围的选项,如下例所示: <service android:name=".MyAccessibilityService"> ... <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> </service>  这个 meta-data元素指的是在应用程序的资源目录创建的一个XML文件。(<project_dir>/res/xml/accessibility_service_config.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参考文档。 4.2 注册辅助性事件     辅助性服务配置参数的最重要的一个功能是允许您指定哪些类型的辅助性事件你的服务可以处理。通过指定这个信息能够是辅助性服务相互配合,并让作为一个开发者的你灵活地处理特定的应用程序的特定事件类型。事件过滤包括下列标准:     包名——指定你想要处理的辅助性服务的应用程序的包名。如果省略该参数,你的辅助性服务被认为是对于任何应用程序的辅助性的事件提供服务。这个参数可以在辅助性性服务配置文件中,android:packageNames属性来设置,这个属性用逗号分隔多个包名,或者使用AccessibilityServiceInfo.packageNames 设置。     事件类型——指定你想要你的服务来处理的辅助性活动的类型。这个参数可以设置在辅助性服务配置文件中,使用android:accessibilityEventTypes属性,用|分隔的字符(例如accessibilityEventTypes = " typeViewClicked | typeViewFocused”),或使用AccessibilityServiceInfo.eventTypes 设置。     当设置辅助性服务,仔细考虑哪些事件你的服务是能够处理,只注册这些事件。因为用户可以激活超过一个辅助性服务,服务必须不使用它是不能够处理事件。记住,其他服务可能会处理这些事件是为了改善用户的体验。     注意:,如果服务提供不同的反馈类型,Android框架分派辅助性事件给多个辅助性服务。然而,如果两个或多个服务提供相同的反馈类型,那么只有第一个注册服务接收事件。 4.3 辅助性服务的方法     一个辅助性服务必须继承AccessibilityService类,并且重写这个类中下面的方法。这些方法由Android系统按顺序调用的,当服务开启时 (onServiceConnected()),当服务运行时(onAccessibilityEvent(), onInterrupt()) ,当服务结束时 (onUnbind())。 onServiceConnected()-(可选)当应用成功连接到你的辅助性服务时,系统调用该方法。使用这个方法为你的辅助性服务做任何一次性设置的步骤,包括连接到用户反馈的系统服务,如音频管理器或设备振动器。如果你想在运行时或者一次性调整你服务的配置,这是一个方便的位置,这种情况时调用setServiceInfo()。onAccessibilityEvent()-(必需)当系统检测到一个匹配你辅助性服务过滤器中设置参数的AccessibilityEvent时,调用该方法。例如,当用户在一个应用程序中点击一个按钮或焦点放在用户界面控件上时,,你的辅助性性服务就可以提供反馈。这种情况下,系统就通过相关连的AccessibilityEvent调用这个方法,然后服务就可以解释和使用为用户提供的反馈了。这个方法在服务的生命周期中可能会被多次调用。onInterrupt()-(必需)当系统中断在你的服务中提供的反馈时调用该方法,通常是在响应用户的诸如移动焦点到不同的控件上的动作时,调用该方法。该方法在你服务的生命周期中被多次的调用。onUnbind()-(可选)当系统即将关闭当前辅助性服务时,调用该方法。使用这个方法来一次性关闭任何程序,包括释放用户反馈系统服务,如音频管理器或设备振动器。     这些回调方法为你的辅助性服务提供基本的结构框架。Android系统以AccessibilityEvent对象的形式对用户提供的返回的数据,如何处理它们由你来决定。更多关于获取信息的辅助性事件的信息,参考实现辅助性训练章节。 4.4 获得事件的细节     Android系统通过AccessibilityEvent对象提供用户界面交互的辅助性服务的信息。Android 4.0之前,一些有效的信息是放在辅助性事件中的,同时提供了大量的用户选择用户界面控件的细节,及有限的上下文信息。在许多情况下,这种缺失的上下文信息对理解被选中的控件,可能是至关重要的。     一个用户界面的示例,日历,还是日程计划的上下文是关键的。如果用户在周一到周五天列表选择了下午4点时间槽,辅助性服务发出“4 PM”的反馈,但是并没有发出星期的名字,这个月中的哪天,月份的名字,这个反馈的结果就是令人困惑的。在这个示例中,对于一个关心会议安排的用户,用户界面控件的上下文是至关重要的。     Android 4.0显著扩展了信息的数量,这些信息是辅助性服务通过基于视图层的辅助性事件获取的关于用户与界面交互的信息。一个视图层是一组用户界面组件,这些组件包含其父类的组件,及其子类组件的用户界面元素。一个视图层次结构是一组用户界面组件,包含组件(父母)和用户界面元素,可以包含由该组件(孩子们)。通过这种方式,Android系统能够提供更丰富的关于辅助性性事件的细节,允许辅助性服务提供更多有用的反馈给用户。     一个辅助性服务获取用户界面事件的信息,通过系统服务的onAccessibilityEvent()回调方法传递的AccessibilityEvent。这个对象提供关于事件的详细信息,包括对象的类型,其描述性文本和其他细节。从Android 4.0(和以前版本中通过在Support Library的AccessibilityEventCompa支持),通过下面这些方法获取额外的关于事件的信息:  AccessibilityEvent.getRecordCount()和getRecord(int)——这些方法允许你检索AccessibilityRecord对象集合,这也使得你通过系统获得AccessibilityEvent。这种层次的细节为这个触发你辅助性服务的事件提供了更多的上下文。AccessibilityEvent.getSource(),这个方法返回一个AccessibilityNodeInfo对象。该对象允许您请求(父母和孩子)的组件的视图布局层,源于辅助性事件。这个特性允许一个辅助性服务调查事件的整个上下文,包括内容和任何封闭视图或子视图的状态。     重点:这种对试图层次的探查,可能通过AccessibilityEvent 为你的辅助性服务,获得潜在用户私人信息。由于这个原因,您的服务必须通过无障碍服务配置XML文件,请求这种级别的访问,包括canRetrieveWindowContent属性设置为true。如果在您的服务配置xml文件不包括此设置,调用getSource()就会失败。     注意:在Android 4.1(API级别16)及以上,getSource()方法,以及AccessibilityNodeInfo.getChild()和getParent(),只返回视图对象,这被认为是(对绘制内容或者响应用户的操作的视图)重要的辅助性。如果你的服务要求所有视图,可以通过设置服务的AccessibilityServiceInfo实例的成员标志标记FLAG_INCLUDE_NOT_IMPORTANT_VIEWS来实现。 4.5 为用户做出动作     从Android 4.0(API级别14)开始,辅助性服务可以代表用户,包括改变输入焦点和选择(激活)的用户界面元素。在Android 4.1(API级别16)行动的范围已经被扩大到包括滚动列表和交互文本字段。辅助性服务也可以采取全局的行动,比如导航到主屏幕,按后退按