首页 > 其他分享 >鸿蒙Accessibility Kit无障碍服务开发指南(一)

鸿蒙Accessibility Kit无障碍服务开发指南(一)

时间:2024-07-26 08:58:08浏览次数:12  
标签:AccessibilityManager 服务 鸿蒙 App 扩展 Accessibility Kit 无障碍

鸿蒙Accessibility Kit无障碍服务开发指南(一)


文章目录


前言

无障碍模式是指任何人在任何情况下都能平等、方便地获取信息并利用信息。其目的是缩小全社会不同阶层、不同地区、不同年龄、不同健康状况的人群在信息理解、信息交互、信息利用方面的数字鸿沟,使其更加方便地参与社会生活,享受数字发展带来的便利。(无障碍开发服务)提供扩展服务的开放能力,三方可基于此开放能力开发出类似读屏软件的扩展服务,同时也为三方应用提供开放能力,使三方应用可以更好的适配扩展服务,以更好的服务于障碍人群和障碍场景。

一、无障碍框架原理


无障碍扩展服务框架提供在三方应用和和扩展服务之间交换信息的标准机制。扩展服务通过AAkit向AAMS发出查询或操作请求,AAMS通过ASACkit向三方应用执行查询或操作请求,并将执行结果返回给扩展服务。
在这里插入图片官方示意图描述官方示意图

1、Accessibility App:基于无障碍扩展服务框架开发的扩展服务,如视障用户使用的读屏App。
2、Target App:被Accessibility App辅助的三方应用。
3、AccessibilityAbilityManagerService(AAMS):无障碍扩展服务框架主服务,用于对Accessibility App生命周期进行管理,同时为Accessibility App和Target App提供信息交互的桥梁。
4、AccessibilityAbility(AAkit):Accessibility App利用AAkit构建扩展服务Ability运行环境,并为Accessibility App提供可查询和操作Target App的接口,如查询节点信息、对节点执行点击/长按操作等。
5、AccessibilitySystemAbilityClient(ASACkit):Target App通过ASACkit向AAMS发送无障碍事件,如内容变化事件等,同时响应Accessibility App通过AAMS请求的指令,如查询节点信息、对节点执行点击/长按操作等。

原理大致了解一下就好了,内部源码也没必要深究,我们只需要知道,即使无障碍服务是在我们Hap应用里面配置的,但实际上运行程序后,无障碍服务和我们的应用也属于两个进程,所以在涉及到通信方面还需要了解跨进程通信的知识

二、使用步骤

1.继承AccessibilityExtensionAbility


代码如下(示例):

class AccessibilityExtAbility extends AccessibilityExtensionAbility {
  onConnect() {
    console.info(`AccessibilityExtAbility onConnect`);
    // 执行初始化业务逻辑的操作
    console.error("accessibility start");
  }

  onDisconnect() {
    console.info(`AccessibilityExtAbility onDisconnect`);
    // 执行资源回收退出业务逻辑的操作
  }

  onAccessibilityEvent(accessibilityEvent: AccessibilityEvent) {
    console.info(`AccessibilityExtAbility onAccessibilityEvent: ${accessibilityEvent.eventType}`);
    // 根据事件信息进行业务逻辑处理
  }
}
export default AccessibilityExtAbility;

AccessibilityExtensionAbility是官方提供的类库,我们只需要自己实现一个类继承一下就行,同时重写它的三个方法。
onConnect:无障碍服务连接时回调 。
onDisconnect:无障碍服务断开时回调。
onAccessibilityEvent:无障碍事件发生时回调,我们可以使用方法里的accessibilityEvent参数获取发生无障碍事件的类型、手势事件和发生事件的组件。

2.配置无障碍服务


在完成自定义无障碍扩展服务的逻辑开发后,还需要在工程中Module对应的module.json5文件中加入新增扩展服务的配置信息。

srcEntry标签为extensionAbility对应的路径。

label标签为extensionAbility在已安装扩展服务列表中显示的名称。

description标签为extensionAbility在已安装扩展服务详情页的帮助信息。

type标签要按照与无障碍子系统的约定进行配置,需要注意的是该值固定为accessibility,否则将无法正常连接。

代码如下(示例):

 "extensionAbilities": [
      {
        "name": "AccessibilityExtAbility",
        "srcEntry": "./ets/AccessibilityExtAbility/AccessibilityExtAbility.ets",
        "label": "$string:MainAbility_label",
        "description": "$string:MainAbility_desc",
        "type": "accessibility",
        "metadata": [
          {
            "name": "ohos.accessibleability",
            "resource": "$profile:accessibility_config"
          }
        ]
      }
    ]

另外,配置信息中的accessibility_config为无障碍扩展服务的具体配置,需要在resources/base/profile/下新建accessibility_config.json文件,在该文件中声明此无障碍扩展服务具备的能力类型,根据业务功能合理声明能力类型

代码如下(示例):

{
  "accessibilityCapabilities": [
    "retrieve",
    "gesture",
    "keyEventObserver"
  ]
}

3.开启无障碍服务


在应用启动后,可以在当前提供设备-设置中的扩展服务管理页的开关按钮来开启/关闭选择的无障碍扩展服务:

1、打开设备设置页面,进入“辅助功能”,“扩展服务”小标题下的“已安装的服务”显示当前安装的扩展服务个数,点击进入,展示安装的扩展服务列表;未安装扩展服务时,“已安装的扩展服务”不可点击,并显示“无服务”。

2、选择需要开启/关闭的扩展服务,通过开关按钮进行扩展服务的开启/关闭。

3、开启时,弹出安全提醒,在倒计时结束后,勾选“我已知晓如上风险,并自愿承担可能导致的后果。”后,可选择“开启”/“不开启”按钮; 关闭时,将开启的开关关闭,即可关闭已开启的扩展服务。

或者在运行时,需要用到无障碍服务可以使用代码判断无障碍服务是否开启并跳转到引导界面。

判断无障碍服务是否开启,思路,判断当前应用进程数是否大于1
代码如下:

 try {
      const data = await appManager.getRunningProcessInformation();
      return data.length > 1
    } catch (err) {
      console.error(`error: ${JSON.stringify(err)}`);
      return false;
    }

跳转到设置无障碍服务界面
代码如下(示例):

 Button('打开无障碍服务', { type: ButtonType.Normal, stateEffect: true })
        .borderRadius(8)
        .width(150)
        .height(50)
        .margin({ top: 20 })
        .linearGradient({
          direction: GradientDirection.Bottom,
          angle: 90,
          colors: [[0x8a00f6, 0.0], [0x5200e9, 0.5]]
        })
        .onClick(() => {
          let want: Want = {
            bundleName: `com.huawei.hmos.settings`,
            abilityName: `com.huawei.hmos.settings.MainAbility`,
            uri: 'accessibility_feature',
          };
          Global.uiAbilityContext.startAbility(want)
        })

4.管理无障碍服务上下文

官方建议我们创建一个AccessibilityManager.ets文件,单独用来管理无障碍服务的上下文
代码如下(示例):

import {
  AccessibilityElement,
  AccessibilityEvent,
  AccessibilityExtensionContext,
  ElementAttributeKeys
} from '@kit.AccessibilityKit';

interface Rect {
  left: number,
  top: number,
  width: number,
  height: number,
}

// 想要查询的属性信息
let wantedAttribute: ElementAttributeKeys[] = ['bundleName', 'text', 'description', 'windowId'];
type attributeValues = string | number | boolean | AccessibilityElement | AccessibilityElement[] | string[] | Rect;

export default class AccessibilityManager {
  private static instance: AccessibilityManager;
  accessibleContext?: AccessibilityExtensionContext;
  currentPageElementArray: Array<AccessibilityElement> | null = null;

  static getInstance(): AccessibilityManager {
    if (!AccessibilityManager.instance) {
      AccessibilityManager.instance = new AccessibilityManager();
    }
    return AccessibilityManager.instance;
  }

  onStart(context: AccessibilityExtensionContext) {
    console.info(`AccessibilityManager onStart`);
    this.accessibleContext = context;
  }

  onStop() {
    console.info(`AccessibilityManager onStop`);
    this.accessibleContext = undefined;
  }

  onEvent(accessibilityEvent: AccessibilityEvent): void {
    console.info(`AccessibilityManager onEvent`);
    switch (accessibilityEvent.eventType) {
      case 'rightThenDown':
      // 获取当前页面的所有节点
        this.getCurrentPageAllElement();
        break;
      case 'leftThenDown':
      // 打印所有节点
        this.printAllElementInfo();
        break;
      default:
        break;
    }
  }
 }

我们可以在无障碍服务的Ability里面的onConnect方法回调时调用该管理类的start方法绑定上下文,同理在断开连接时释放,当拿到该上下文后我们就可以使用该上下文获取窗口根节点等信息。

标签:AccessibilityManager,服务,鸿蒙,App,扩展,Accessibility,Kit,无障碍
From: https://blog.csdn.net/weixin_68781269/article/details/140699127

相关文章

  • 鸿蒙OS物联网创新应用实训解决方案
    摘要: 随着物联网技术的飞速发展,各种智能设备和传感器正在以前所未有的速度融入我们的日常生活。华为推出的鸿蒙操作系统(HarmonyOS)作为一款面向全场景、多设备、无缝连接的分布式操作系统,为物联网领域带来了全新的机遇与挑战。为了培养具备鸿蒙OS开发能力的物联网人才,唯众......
  • Harmony鸿蒙实战开发-记事本「登录保护」【源码在文末】
    Harmony鸿蒙实战开发-记事本「登录保护」【源码在文末】文章目录Harmony鸿蒙实战开发-记事本「登录保护」【源码在文末】一、运行演示1、注册2、登录3、主页4、编写二、部分代码三、源码运行工具:DevEcoStudio一、运行演示1、注册2、登录3、主页4、编写......
  • 探索WebKit的CSS表格布局:打造灵活的网页数据展示
    探索WebKit的CSS表格布局:打造灵活的网页数据展示CSS表格布局是一种在网页上展示数据的强大方式,它允许开发者使用CSS来创建类似于传统HTML表格的布局。WebKit作为许多流行浏览器的渲染引擎,提供了对CSS表格布局的全面支持。本文将深入探讨WebKit如何实现对CSS表格布局的支持,......
  • 鸿蒙4.2安装apk应用软件
    先在电脑安装adb:https://blog.csdn.net/qq_37858386/article/details/119351940在手机上开开发者模式:点击关于手机里的harmonyOS版本号,点个四五次就弹出来了在手机上搜索usb:把usb调试打开:用数据线连接电脑,把usb配置改成以太网:进入cmd,如果没配adb全局变量,就进入adb的目录,使用a......
  • 鸿蒙 HarmonyOS axios封装
    ✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向)......
  • 鸿蒙HarmonyOS【应用开发一、鸿蒙简介】
    ✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向)......
  • SvelteKit - 1. 初始化项目
    官方doc-createaproject1、基本环境(下面是我这里的环境,亲测用node14和16install会报错)node:20.9.0npm:10.1.02、初始化项目npmcreatesvelte@latestmy-appcdmy-appnpminstallnpmrundevcreate时的选择:其中第一步选择创建应用的类型,有三个可供选......
  • WebKit与PWA:打造无缝的渐进式Web应用体验
    WebKit与PWA:打造无缝的渐进式Web应用体验随着移动互联网的快速发展,用户对于Web应用的体验要求越来越高。ProgressiveWebApps(PWA),即渐进式Web应用,以其无需安装、易于更新、跨平台等特性,成为现代Web应用的发展趋势。WebKit作为许多流行浏览器的底层引擎,对PWA的支持至关重要......
  • WebKit的文本装饰艺术:CSS Text Decoration全解析
    WebKit的文本装饰艺术:CSSTextDecoration全解析CSS文本装饰(TextDecoration)是一组用于美化和增强网页文本表现的属性,它们可以为文本添加下划线、上划线、线删除和强调标记等效果。WebKit作为许多现代浏览器的渲染引擎,对CSS文本装饰的支持非常全面。本文将深入探讨WebKit对......
  • WebKit的WebXR Hand Input API:开启虚拟现实交互新纪元
    WebKit的WebXRHandInputAPI:开启虚拟现实交互新纪元随着虚拟现实(VR)和增强现实(AR)技术的发展,用户对于沉浸式体验的需求日益增长。WebKit的WebXRHandInputAPI为开发者提供了一种新的交互方式,允许用户通过手势直接与虚拟世界进行交互。这项技术的应用前景广阔,从游戏到教育......