跳转到内容

权限引导

更新: 2025/7/20 字数: 0 字 时长: 0 分钟

背景说明

在运行脚本前,通常需要用户授予某些关键权限。然而,用户的操作水平参差不齐,常会因缺乏引导而导致权限未开启,影响脚本功能的正常运行。

为提升用户体验,降低沟通成本,我们推荐通过统一的 UI 引导界面来帮助用户便捷地完成权限开启操作。这也符合无障碍权限“以人为本”的设计初衷。

解决方案概述

  1. 枚举并梳理常见权限
  2. 判断权限当前状态
  3. 引导用户跳转并授予权限
  4. 将权限状态与 UI 进行联动反馈

常见权限说明与处理方法

以下为在脚本中经常涉及的 7 类权限,包括其状态获取方式及开启引导方式:


1. 无障碍服务


2. 悬浮窗权限

示例代码:

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 状态
    }
});

3. 前台服务权限

状态判断:

js
$settings.isEnabled('foreground_service')

开启方式:

js
$settings.setEnabled('foreground_service', true)

4. 无障碍稳定模式

说明: 该模式可避免访问“不重要”的视图,详情可参考 官方文档

状态判断:

js
$settings.isEnabled('stable_mode')

开启方式:

js
$settings.setEnabled('stable_mode', true)

5. 截图权限

状态判断:

js
$images.getScreenCaptureOptions()

申请权限:

js
$images.requestScreenCapture(options)

取消权限:

js
$images.stopScreenCapture()

⚠️ 在 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");

跳转授权页面:

js
app.startActivity({
    action: "android.settings.USAGE_ACCESS_SETTINGS",
});

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); // 后台弹出权限

总结 通过集中统一的权限引导界面,可显著提高用户授权效率和脚本运行成功率。推荐在脚本启动时主动检查权限状态,并通过 UI 提示引导用户完成授权操作。