更新记录

1.0.4(2024-05-06)

  1. 增加节点绘制功能,点击打印节点信息。
  2. 修改节点工具接口 NodeTarget 中的 nodeList泛型为 AutoAccessibilityNodeInfo包装类,提供 toJSONString() 方法。

1.0.3(2024-05-02)

  1. 提供完整调用示例,修改接口规范。
  2. 节点工具 NodeTargetInterface接口 修改为 NodeTargetType类型。
  3. 屏幕抓取工具 ScreenshotHelperInterface接口 修改为 ScreenshotHelperType类型。
  4. AutoImageInterface 修改为 AutoImageType。

1.0.2(2024-05-01)

  1. 节点工具接口 NodeTargetInterface 增加 nodeList 属性(筛选到的无障碍节点数据)。
  2. 使用文档增加 screenshotHelperInstance 和 nodeTargetInstance 说明
查看更多

平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 3.8.1,Android:4.4,iOS:不支持 × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序
× × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

xuehn-accessibilityService

开发文档

UTS 语法 UTS API插件 UTS 组件插件 Hello UTS

插件接口

无障碍

import { 
    checkAccessibilityService,
    requestAccessibilityService
    } from "@/uni_modules/xuehn-accessibilityService";  

// 检查无障碍服务状态
const flag:boolean = checkAccessibilityService();
// 申请无障碍权限
requestAccessibilityService();

前台服务

import { 
    startForegroundService,
    stopForegroundService
    } from "@/uni_modules/xuehn-accessibilityService";  

// 开启前台服务
startForegroundService();
// 停止前台服务
stopForegroundService();

电池优化

import { 
    checkBatteryOptimizeStatus,
    requestIgnoreBatteryOptimization
    } from "@/uni_modules/xuehn-accessibilityService";  

// 检查电池优化状态
checkBatteryOptimizeStatus();
// 请求忽略电池优化
requestIgnoreBatteryOptimization(requestCode:number);

节点工具

import { 
    NodeTarget,
    // 创建无障碍节点实例,创建时会捕捉当前屏幕全部节点
    nodeTargetInstance
    } from "@/uni_modules/xuehn-accessibilityService";  

// 节点抓取
const nodeTarget = nodeTargetInstance() as NodeTarget;
// 节点绘制
nodeTarget.drawNodeList();
// 打印节点
const nodeList:Array<AutoAccessibilityNodeInfo> = nodeTarget.nodeList;
nodeList.forEach(node => {
    console.log(node.toJSONString());
    // const childList:Array<AutoAccessibilityNodeInfo>|null = node.getChildList();
})
if(nodeTarget != null){
    nodeTarget
        .id("com.text:id/tabIV")
        .idMatch("id正则")
        .text("点击测试")
        .textMatch("text正则")
        .description("description")
        .descriptionMatch("description正则")
        .className("className")
        .classNameMatch("className正则")
        .packageName("packageName")
        .packageNameMatch("packageName正则")
        .drawingOrder(number)
        .visible(boolean)
        .bounds(AutoBounds)
        .checkable(boolean)
        .checked(boolean)
        .clickable(boolean)
        .longClickable(boolean)
        .scrollable(boolean)
        .focusable(boolean)
        .enabled(boolean)
        .focused(boolean)
        .selected(boolean)
        .childCount(number)
        .click();
        .longClick()
        .swipe(x: number, y: number, duration: number): boolean
        .drag(startX: number, startY: number, endX: number, endY: number, duration: number): boolean
        .recycleAccessibilityNodeInfo(): void;
}

屏幕捕捉

import { 
    AutoImage,
    ScreenshotHelper,
    // 创建屏幕捕捉实例(需先开启前台服务)
    screenshotHelperInstance
    } from "@/uni_modules/xuehn-accessibilityService";  

const screenshotHelper = screenshotHelperInstance() as ScreenshotHelper;
// 请求截图权限
screenshotHelper?.requestScreenCapture();
// 屏幕捕捉
const autoImage:AutoImage = screenshotHelper?.captureImage();

完整测试示例

<template>
    <view>
        <button text="点击测试" @onclick="test()"></button>

        <button text="开启前台服务" @onclick="startForegroundService()"></button>
        <button text="停止前台服务" @onclick="stopForegroundService()"></button>

        <button text="申请截图权限(需要前台服务)" @onclick="testRequestScreenCapture()"></button>
        <button text="获取截图" @onclick="testCaptureImage()"></button>

        <button text="检查无障碍服务状态" @onclick="testCheckAccessibilityService()"></button>
        <button text="申请无障碍服务权限" @onclick="testRequestAccessibilityService()"></button>

        <button text="检查悬浮窗服务状态" @onclick="testCheckFloatWindowStatus()"></button>
        <button text="请求悬浮窗权限" @onclick="requestFloatWindow()"></button>

        <button text="绘制节点(双击退出绘制)" @onclick="testNodeTarget()"></button>
    </view>
</template>

<script lang="uts" setup>

    // import { ComponentPublicInstance } from 'vue'
    import { 
        checkAccessibilityService,
        requestAccessibilityService,

        startForegroundService,
        stopForegroundService,

        checkBatteryOptimizeStatus,
        requestIgnoreBatteryOptimization,

        checkFloatWindowStatus,
        requestFloatWindow,

        NodeTarget,
        AutoAccessibilityNodeInfo,
        nodeTargetInstance,

        ScreenshotHelper,
        screenshotHelperInstance,

        AutoImage,

        } from "@/uni_modules/xuehn-accessibilityService";  

    const test = () => {
        console.log("点击了测试")
    }

    /**
     * 测试-请求截图权限
     */
    let screenshotHelper:ScreenshotHelper|null = null;
    const testRequestScreenCapture = () => {
        screenshotHelper = screenshotHelperInstance() as ScreenshotHelper;
        screenshotHelper?.requestScreenCapture();
    }

    /**
     * 测试-抓取屏幕
     */
    const testCaptureImage = () => {
        if(screenshotHelper != null){
            const autoImage:AutoImage|null = screenshotHelper?.captureImage();
            if(autoImage != null){
                console.log(JSON.stringify(autoImage))
                console.log(autoImage.getBase64())
            }
        }else {
            console.log("未申请截图权限")
        }
    }

    /**
     * 测试-检查无障碍状态
     */
    const testCheckAccessibilityService = () => {
        console.log(checkAccessibilityService())
    }

    /**
     * 测试-请求无障碍权限
     */
    const testRequestAccessibilityService = () => {
        requestAccessibilityService()
    }

    /**
     * 测试-检查悬浮窗权限状态
     */
    const testCheckFloatWindowStatus = () => {
        console.log(checkFloatWindowStatus())
    }

    /**
     * 测试-无障碍节点
     */
    const testNodeTarget = () => {
        const nodeTarget = nodeTargetInstance() as NodeTarget;
        // 节点绘制
        nodeTarget.drawNodeList();
        // 打印节点
        const nodeList:Array<AutoAccessibilityNodeInfo> = nodeTarget.nodeList;
        nodeList.forEach(node => {
            console.log(node.toJSONString());
            // const childList:Array<AutoAccessibilityNodeInfo>|null = node.getChildList();
        })
    }

</script>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<!--创建前台服务权限--> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 获取屏幕内容 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.READ_FRAME_BUFFER"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 电池优化权限 --> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <!-- 悬浮窗 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问