权限引导
更新: 2025/7/20 字数: 0 字 时长: 0 分钟
背景说明
在运行脚本前,通常需要用户授予某些关键权限。然而,用户的操作水平参差不齐,常会因缺乏引导而导致权限未开启,影响脚本功能的正常运行。
为提升用户体验,降低沟通成本,我们推荐通过统一的 UI 引导界面来帮助用户便捷地完成权限开启操作。这也符合无障碍权限“以人为本”的设计初衷。
解决方案概述
- 枚举并梳理常见权限
- 判断权限当前状态
- 引导用户跳转并授予权限
- 将权限状态与 UI 进行联动反馈
常见权限说明与处理方法
以下为在脚本中经常涉及的 7 类权限,包括其状态获取方式及开启引导方式:
1. 无障碍服务
状态判断:
开启方法:
- 参考前文《无障碍服务启用指南》
2. 悬浮窗权限
- 状态判断:
- 引导方法(两种):
- 简单方式:
floaty.requestPermission()
- 高级方式:使用
activity.startActivityForResult()
获取回调
- 简单方式:
示例代码:
js
"ui"; // 启用 Bot.js 的 UI 模式,确保可以使用 Activity 和权限相关 API
let mIntent = app.intent({
action: "android.settings.action.MANAGE_OVERLAY_PERMISSION",
data: "package:" + context.getPackageName(),
});
activity.startActivityForResult(mIntent, 1);
activity.getEventEmitter().on("activity_result", (requestCode, resultCode, data) => {
if (requestCode === 1) {
toast(floaty.checkPermission());
// 可在此处同步 UI 状态
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
3. 前台服务权限
状态判断:
js
$settings.isEnabled('foreground_service')
1
开启方式:
js
$settings.setEnabled('foreground_service', true)
1
4. 无障碍稳定模式
说明: 该模式可避免访问“不重要”的视图,详情可参考 官方文档
状态判断:
js
$settings.isEnabled('stable_mode')
1
开启方式:
js
$settings.setEnabled('stable_mode', true)
1
5. 截图权限
状态判断:
js
$images.getScreenCaptureOptions()
1
申请权限:
js
$images.requestScreenCapture(options)
1
取消权限:
js
$images.stopScreenCapture()
1
⚠️ 在 Android 11+ 设备上,可通过 $automator.takeScreenshot() 使用无障碍直接截图,但频率有限(约每秒 1 次)
6. 使用统计访问权限(Usage Stats)
用途:
更精准地获取当前应用包名,如 currentPackage()
查询 App 的运行记录
状态判断(封装示例):
js
function checkSystemService(service) {
importClass(android.app.AppOpsManager);
const appOps = context.getSystemService(context.APP_OPS_SERVICE);
const mode = appOps.checkOpNoThrow("android:get_" + service, android.os.Process.myUid(), context.getPackageName());
return mode === AppOpsManager.MODE_ALLOWED;
}
checkSystemService("usage_stats");
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
跳转授权页面:
js
app.startActivity({
action: "android.settings.USAGE_ACCESS_SETTINGS",
});
1
2
3
2
3
7. 后台弹出权限(小米 MIUI 专属)
用途: 判断是否允许脚本使用 app.launchPackage() 后自动弹出界面
状态判断(封装示例):
js
function checkMiuiPermission(flag) {
importClass(android.app.AppOpsManager);
const appOps = context.getSystemService(context.APP_OPS_SERVICE);
try {
const paramTypes = java.lang.reflect.Array.newInstance(java.lang.Class, 3);
paramTypes[0] = java.lang.Integer.TYPE;
paramTypes[1] = java.lang.Integer.TYPE;
paramTypes[2] = java.lang.Class.forName("java.lang.String");
const method = appOps.getClass().getMethod("checkOpNoThrow", paramTypes);
const op = new java.lang.Integer(flag);
const result = method.invoke(appOps, op, android.os.Process.myUid(), context.getPackageName());
return result === AppOpsManager.MODE_ALLOWED;
} catch (err) {
console.error(err);
return false;
}
}
checkMiuiPermission(10021); // 后台弹出权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
总结 通过集中统一的权限引导界面,可显著提高用户授权效率和脚本运行成功率。推荐在脚本启动时主动检查权限状态,并通过 UI 提示引导用户完成授权操作。