无障碍服务

1,875 阅读3分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

无障碍服务

无障碍服务是一种应用,可提供界面增强功能,来协助残障用户或可能暂时无法与设备进行全面互动的用户完成操作。

创建无障碍服务

无障碍服务可与普通的应用捆绑在一起,也可作为独立的 Android 项目创建。不管是哪种情况,创建这种服务的步骤都是相同的。在项目中,创建一个扩展AccessibilityService的类。

package com.example.android.apis.accessibility;
import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
public class MyAccessibilityService extends AccessibilityService {
...
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
    }
    @Override
    public void onInterrupt() {
    }
...
}

如果您为该服务创建了一个新项目,并且不打算让任何应用与该服务相关联,则可以从源代码中移除启动器 Activity 类。

清单声明和权限

提供无障碍服务的应用必须在其应用清单中包含特定的声明,这样才能被 Android 系统视为无障碍服务。本部分介绍了无障碍服务的必需设置和可选设置。

无障碍服务声明:

无障碍服务声明必须在清单的application元素(不是activity元素)。此外,在service元素中,您还必须添加一个无障碍服务 intent 过滤器。为了与 Android 4.1 及更高版本兼容,清单还必须保护该服务,方法是添加BIND_ACCESSIBILITY_SERVICE权限以确保只有系统可以绑定到它。示例如下:

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

无障碍服务配置

无障碍服务还必须提供配置,用于指定该服务能够处理的无障碍事件类型以及有关该服务的其他信息。无障碍服务配置有两种方式:(1)无障碍服务的配置包含在 AccessibilityServiceInfo 类中。您的服务可以在运行时使用此类的实例和 setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo) 构建和设置配置。不过,使用此方法时,并非所有配置选项都可用:

@Override
public void onServiceConnected() {
    //设置此服务要侦听的事件类型。其他将不会传递到此服务。
    info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED |
            AccessibilityEvent.TYPE_VIEW_FOCUSED;
    //如果您只希望此服务与特定应用程序配合使用,请设置其

    //这里是包名。否则,当服务被激活时,它将侦听

    //从所有应用程序发送事件。
    info.packageNames = new String[]
            {"com.example.android.myFirstApp", "com.example.android.mySecondApp"};
    //设置您的服务将提供的反馈类型。
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
    //仅当不存在特定于包的服务时,才会调用默认服务

    //用于生成的AccessibilityEvent的类型。这项服务是*

    //特定于应用程序,因此不需要该标志。如果这是一个

    //通用服务,应该考虑设置默认标志。
    // info.flags = AccessibilityServiceInfo.DEFAULT;
    info.notificationTimeout = 100;
    this.setServiceInfo(info);
}

第二种方式是使用 XML 文件配置服务。某些配置选项(如canRetrieveWindowContent仅在您使用 XML 配置服务时可用。从 Android 4.0 开始,您可以在清单中添加一个引用配置文件的元素,这样可让您为无障碍服务设置所有选项,如以下示例所示:

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

此元数据元素引用您在应用的资源目录中创建的一个 XML 文件 (/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"
/>

android:accessibilityEventTypes="typeAllMask"

用来设置响应事件的类型,typeAllMask当然就是响应所有类型的事件了。当然还有单击、长按、滑动等。

android:accessibilityFeedbackType="feedbackSpoken"

设置回馈给用户的方式,有语音播出和振动。可以配置一些TTS引擎,让它实现发音。

android:notificationTimeout="100"

响应时间的设置

android:packageNames="com.example.android.apis"

可以指定响应某个应用的事件,这里因为要响应所有应用的事件,所以不填,默认就是响应所有应用的事件。