怎么自动同意requestScreenCapture并适配各个系统,包括解除屏幕共享拦截

rceujuhdpr · 2 天前

回答

Hamibot AI
1
· 2 天前

要实现 requestScreenCapture() 的自动权限同意并适配多个系统(如 MIUI、EMUI、ColorOS 等),同时处理“屏幕共享拦截”或截图确认弹窗,可以通过启动一个后台监控线程,在请求截图权限后自动识别并点击“允许”按钮。

由于不同厂商系统的弹窗标题、控件 ID 和布局结构不同,需要针对性地编写检测逻辑。以下是一个通用且兼容性强的解决方案:


// 文档地址 https://docs.hamibot.com/

// 启动后台线程监控截图权限弹窗
threads.start(function () {
    const check = function () {
        try {
            var activity = currentActivity().toLowerCase();

            // ====================== MIUI (Xiaomi) ======================
            if (activity.indexOf('permission') !== -1) {
                if (id('com.android.systemui:id/dialog_title').textContains('Hamibot').exists()) {
                    var btn = id('android:id/button1').findOnce();
                    if (btn && btn.clickable()) {
                        btn.click();
                        log('MIUI: 已点击【允许】');
                        return;
                    }
                }
            }

            // ====================== EMUI (Huawei) ======================
            if (id('android:id/alertTitle').textContains('屏幕截图').exists() ||
                text('屏幕投影').exists() ||
                text('屏幕共享').exists()) {
                click('允许');
                click('开始共享');
                click('立即开始');
                log('EMUI: 尝试点击共享允许');
                return;
            }

            // ====================== ColorOS (OPPO/OnePlus) ======================
            if (textMatches(/(屏幕共享|屏幕录制|投屏)/).exists()) {
                click('允许');
                click('立即开始');
                click('开始录制');
                log('ColorOS: 尝试点击允许');
                return;
            }

            // ====================== Vivo Funtouch OS ======================
            if (textContains('请求截屏').exists() || textContains('是否允许').exists()) {
                click('允许');
                click('确定');
                log('Vivo: 尝试点击允许');
                return;
            }

            // ====================== Samsung One UI ======================
            if (textContains('screen capture').exists() && textContains('allow').exists()) {
                click('ALLOW');
                log('Samsung: 允许截图');
                return;
            }

            // ====================== Flyme (Meizu) ======================
            if (textContains('截屏提醒').exists()) {
                click('允许');
                log('Flyme: 允许截屏');
                return;
            }

            // 如果未匹配到任何弹窗,则 500ms 后继续检查
            setTimeout(check, 500);
        } catch (e) {
            log('监控线程异常:', e.message);
            setTimeout(check, 500); // 出错后重试
        }
    };

    check(); // 开始首次检查
});

// 请求截图权限
if (!requestScreenCapture()) {
    toastLog('请求截图权限失败,可能被系统拦截');
    hamibot.exit();
}

// 关闭监控线程(确保后续操作不会重复触发)
threads.shutDownAll();

// 延迟一点时间,确保弹窗完全消失后再执行 captureScreen
sleep(1500);

// 此处开始你的主脚本逻辑
var img = captureScreen();
toastLog('截图成功,开始图像处理...');

✅ 功能说明

  • 多系统适配:覆盖小米(MIUI)、华为(EMUI)、OPPO(ColorOS)、vivo、三星、魅族等主流国产定制系统。
  • 自动点击“允许”:通过控件 ID、文本内容等方式定位按钮,并模拟点击。
  • 容错与稳定性增强
    • 使用 try-catch 防止监控线程崩溃。
    • 多次尝试点击常见按钮文本(如“立即开始”、“允许”)。
  • 及时关闭线程:调用 threads.shutDownAll() 防止残留线程影响性能或其他脚本。

🛠️ 调试建议

  1. 使用 Hamibot 设备调试工具(Inspector) 查看当前弹窗的真实控件结构。
  2. check() 函数中添加 toastLog(currentActivity())log(device.brand, device.model) 来判断设备品牌和当前界面。
  3. 若点击无效,可改用坐标点击(不推荐长期使用):
    click(device.width / 2, device.height * 0.8);
    

⚠️ 注意事项

ℹ️ 本回答由 AI 生成,内容仅供参考