更新记录
1.0.1(2026-05-10) 下载此版本
重构
1.0.0(2025-08-28) 下载此版本
经过 华为、荣耀、小米、oppo、vivo 真机测试,正常运行。需开发人员根据业务自己适配具体功能。
平台兼容性
uni-app(5.08)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.1 | √ | 1.0.1 | - | - | √ | 1.0.1 | √ | 1.0.1 | 5.0 | 1.0.1 | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.08)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | 5.0 | × | × | × |
laoqianjunzi-accessi
平台支持
- Android App:支持完整能力
- Web:空实现,仅用于编译兜底
- iOS:空实现,仅用于编译兜底
- Harmony:空实现,仅用于编译兜底
导入方式
在页面或公共 .uts 文件中统一从插件根目录导入:
import {
openAccessibilitySettings,
isAccessibilitySettingsOn,
findNodes,
performClickAt
} from '@/uni_modules/laoqianjunzi-accessi'
推荐使用流程
建议按下面的顺序调用:
- 先用
isAccessibilitySettingsOn()或isAccessibilityEnabled()判断服务状态 - 未开启时调用
openAccessibilitySettings()引导用户开启 - 再根据业务场景选择全局操作、节点操作、监听能力或手势能力
- 如果使用事件监听,页面销毁时记得调用
stopListener() - 如果要做复杂授权或设置页自动化,优先使用
readRomProfile()、recognizeSettingsPage()与runAutomationFlow()组合
能力分层
插件目前建议按三层理解:
- 基础层:服务状态、系统级动作、节点查找、手势操作
- 结构化层:
AccessLocator、collectMatches()、executeOnMatch()、exportNodeTree() - 编排层:
AccessFlowStep、runAutomationFlow()、getAutomationFlowState()、stopAutomationFlow()
API 分类
1. 服务状态与设置
| API | 说明 | 返回值 |
|---|---|---|
isAccessibilitySettingsOn() |
判断无障碍服务是否已可用 | boolean |
isAccessibilityEnabled() |
同上,兼容另一套命名 | boolean |
openAccessibilitySettings() |
打开系统无障碍设置页 | boolean |
示例:
const enabled = isAccessibilitySettingsOn()
if (!enabled) {
openAccessibilitySettings()
}
2. 应用调度与全局操作
| API | 说明 | 返回值 |
|---|---|---|
launchApp(packageName, activityPage?) |
启动应用,可选指定页面类名 | boolean |
launchAppByURI(androidScheme) |
通过 URI Scheme 启动应用 | boolean |
bringAppToFront(packageName) |
把指定应用切到前台 | boolean |
forceStopApp(packageName) |
强制结束指定应用 | boolean |
closeApp(packageName?) |
尝试关闭应用 | void |
goHome() |
返回桌面 | void |
goBack() |
执行返回 | void |
performHomeAction() |
全局 Home 操作 | boolean |
performBackAction() |
全局返回操作 | boolean |
performRecentAppsAction() |
打开最近任务 | boolean |
performNotificationsAction() |
展开通知栏 | boolean |
示例:
launchApp('com.android.settings')
performBackAction()
performHomeAction()
3. 快捷节点操作
| API | 说明 | 返回值 |
|---|---|---|
screenNodeTree() |
获取当前页面节点树 | Array<any> |
findNodeByText(text) |
查找包含指定文本的节点 | boolean |
clickNodeByText(text) |
点击包含指定文本的节点 | boolean |
clickAtPosition(x, y) |
点击指定坐标 | boolean |
doSlideScreen() |
执行上滑操作 | void |
doSlideScreenDown() |
执行下滑操作 | void |
getSwitchState(identifier, type?) |
读取开关状态 | boolean \| null |
getCheckState(identifier, type?) |
读取勾选状态 | boolean \| null |
setCheckState(identifier, status, reopen?) |
设置勾选状态 | boolean \| null |
说明:
type取值为'text'或'id'identifier为节点文本或节点 id
示例:
const found = findNodeByText('允许')
if (found) {
clickNodeByText('允许')
}
const checked = getCheckState('允许通知')
if (checked == false) {
setCheckState('允许通知', true)
}
4. 事件监听
| API | 说明 | 返回值 |
|---|---|---|
startListener(packageNames, listenAllEvents, callback) |
开始监听无障碍事件 | void |
stopListener() |
停止监听 | void |
回调数据格式:
- 第 1 项:类名
- 第 2 项:包名
- 第 3 项:事件类型
示例:
startListener(['com.android.settings'], true, (eventData : Array<string>) => {
console.log('eventData', eventData)
})
stopListener()
5. 节点判断与批量检查
| API | 说明 | 返回值 |
|---|---|---|
checkNodeByViewIdAndTextAndContentDesc(options) |
根据 viewId、text、contentDesc 判断节点是否存在 |
boolean |
checkMultipleNodeByViewIdsAndTextsAndContentDescs(conditions) |
批量判断多个条件是否都命中 | boolean |
getNodesCount(options) |
统计符合条件的节点数量 | number |
常见过滤字段:
viewIdtextcontentDescclassNamepackageNamehintvisibleenabledclickablefocusablefocusedtextMatchcontentDescMatchhintMatch
示例:
const exists = checkNodeByViewIdAndTextAndContentDesc({
text: '确定'
})
const count = getNodesCount({
text: '确定',
clickable: true
})
6. 高级节点操作
| API | 说明 | 返回值 |
|---|---|---|
operateNodeAdvanced(options) |
对命中的节点执行高级操作 | boolean |
clickNodeIndex(options) |
点击指定索引节点 | boolean |
doubleClickNodeIndex(options) |
双击指定索引节点 | boolean |
longClickNodeIndex(options) |
长按指定索引节点 | boolean |
focusNodeIndex(options) |
聚焦指定索引节点 | boolean |
inputTextToNode(options) |
向指定节点输入文本 | boolean |
scrollNode(options) |
对指定节点执行滚动 | boolean |
clearNodeText(options) |
清空节点文本 | boolean |
isNodeActionable(options) |
判断节点是否支持某种操作 | boolean |
operateNodeAdvanced(options) 重点参数:
index: 节点索引数组,如[0]actionType:click、doubleclick、longclick、focus、scroll_forward、scroll_backward等edit: 要输入的文本;传空字符串可清空输入框- 其它筛选字段与
getNodesCount基本一致
示例:
inputTextToNode({
hint: '请输入手机号',
index: [0],
inputText: '***'
})
clickNodeIndex({
text: '登录',
index: 0
})
7. 节点详情与环境信息
| API | 说明 | 返回值 |
|---|---|---|
findNodes(options) |
获取符合条件的节点详情列表 | Array<UTSJSONObject> |
getCurrentActivityInfo() |
获取当前前台页面信息 | Map<string, string> \| null |
getScreenSize() |
获取屏幕宽高 | Map<string, number> |
示例:
const nodes = findNodes({
text: '允许',
clickable: true
})
const screenSize = getScreenSize()
console.log('width', screenSize.get('width'))
console.log('height', screenSize.get('height'))
8. 手势模拟
| API | 说明 | 返回值 |
|---|---|---|
performSwipe(startX, startY, endX, endY, duration) |
自定义滑动 | boolean |
performVerticalSwipe(x, startY, endY, duration) |
垂直滑动 | boolean |
performHorizontalSwipe(startX, endX, y, duration) |
水平滑动 | boolean |
performSwipeDown(x, distance, duration) |
下滑 | boolean |
performSwipeUp(x, distance, duration) |
上滑 | boolean |
performClickAt(x, y, duration) |
点击坐标 | boolean |
performLongClickAt(x, y, duration) |
长按坐标 | boolean |
performDoubleClickAt(x, y, interval) |
双击坐标 | boolean |
performDrag(startX, startY, endX, endY, pressDuration, swipeDuration) |
拖拽 | boolean |
performClickCenter() |
点击屏幕中心 | boolean |
performClickAtRelative(relativeX, relativeY) |
按相对坐标点击 | boolean |
示例:
performSwipeUp(500, 800, 400)
performClickAt(540, 1200, 100)
performClickAtRelative(0.5, 0.5)
9. 结构化能力与流程编排
新增一组更适合复杂自动化的能力:
readBridgeState():读取插件桥接状态readRomProfile()/recognizeSettingsPage()/matchSettingsPage():读取 ROM 指纹并识别当前设置页beginEventFeed()/finishEventFeed():结构化事件订阅exportNodeTree()/collectMatches():输出树形节点快照、批量命中结果inspectTarget()/inspectBatch()/measureMatches():条件判断与匹配计数executeOnMatch()/tapMatch()/fillMatch():按结构化定位条件执行动作runAutomationFlow()/getAutomationFlowState()/stopAutomationFlow():内置轻量流程执行器,支持步骤、等待、重试、延迟、失败继续
结构化 locator 常用字段:
text/textMatchcontentDesc/contentDescMatchviewIdclassNamepackageNameclickable/enabled/visible
结构化执行示例:
const exists = inspectTarget({
text: '允许',
clickable: true
} as UTSJSONObject)
if (exists) {
tapMatch({
text: '允许',
clickable: true
} as UTSJSONObject)
}
流程步骤常见动作:
launch_appwaitwait_matchtaptap_pointinputtogglebackhomeclose_settings
示例:
import {
getAutomationFlowState,
runAutomationFlow,
stopAutomationFlow
} from '@/uni_modules/laoqianjunzi-accessi'
const started = runAutomationFlow([
{
stepId: 'open-settings',
action: 'launch_app',
targetPackage: 'com.android.settings',
delayAfter: 1200
},
{
stepId: 'wait-notification',
action: 'wait_match',
locator: {
text: '通知'
} as UTSJSONObject,
waitTimeout: 5000,
waitInterval: 300
},
{
stepId: 'tap-notification',
action: 'tap',
locator: {
text: '通知'
} as UTSJSONObject,
retryCount: 2,
retryInterval: 500,
retryAction: 'scroll_forward'
}
])
if (!started) {
console.log('流程未启动', getAutomationFlowState())
}
// 页面销毁或用户手动终止时
stopAutomationFlow()
10. ROM 与设置页识别
这组能力适合权限引导、品牌差异分流、自启动/悬浮窗/使用情况访问等系统设置自动化。
| API | 说明 | 返回值 |
|---|---|---|
readRomProfile() |
读取品牌、厂商、ROM 标识与归一化 vendor | AccessRomProfile |
recognizeSettingsPage() |
识别当前设置页 | AccessPageRecognition \| null |
matchSettingsPage(pageKey) |
判断当前是否为指定设置页 | boolean |
内置已覆盖的页面 key 包括:
system_settingsaccessibilityoverlay_permissionusage_accessnotification_managerautostart_managerbattery_managerapp_manager
示例:
const profile = readRomProfile()
console.log('vendor', profile.vendor)
const page = recognizeSettingsPage()
if (page != null) {
console.log('当前设置页', page.pageKey, page.matchedKeywords)
}
if (matchSettingsPage('autostart_manager')) {
console.log('当前已经进入自启动管理页')
}
常见组合示例
示例 1:检查服务并引导开启
if (!isAccessibilitySettingsOn()) {
openAccessibilitySettings()
}
示例 2:等待按钮出现后点击
const exists = checkNodeByViewIdAndTextAndContentDesc({
text: '同意并继续'
})
if (exists) {
clickNodeByText('同意并继续')
}
示例 3:监听指定应用事件
startListener(['com.tencent.mm'], true, (data : Array<string>) => {
console.log('监听到事件', data)
})
示例 4:按 ROM 分流授权逻辑
const profile = readRomProfile()
if (profile.vendor == 'xiaomi') {
console.log('走小米权限路径')
} else if (profile.vendor == 'vivo') {
console.log('走 vivo 权限路径')
} else {
console.log('走通用权限路径')
}
注意事项
- 本插件主要面向 Android App,真机能力依赖无障碍服务授权
openAccessibilitySettings()只能拉起设置页,用户仍需手动开启服务- 节点匹配依赖目标应用当前页面结构,系统升级或应用改版后可能需要调整参数
- 使用监听能力后请及时调用
stopListener(),避免页面退出后仍持续回调 runAutomationFlow()当前是轻量执行器,适合设置页授权、确定性流程,不建议直接替代复杂业务状态机recognizeSettingsPage()是启发式识别,适合做分流和容错,不建议把单一关键词识别当成唯一判断条件- 非 Android 平台只有空实现,返回值通常为
false、0、null或空集合

收藏人数:
https://gitee.com/laoqianjunzi/laoqianjunzi-accessibility
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 1144
赞赏 2
下载 12101492
赞赏 1918
赞赏
京公网安备:11010802035340号