脚本如何关闭自身的应用,没有root权限

已存档
jason lin · 2 个月前
第 1 条补充
·
2 个月前

脚本申请了屏幕录制权限,如何主动释放掉屏幕录制权限

第 2 条补充
·
2 个月前

如何截长图

回答

Hamibot AI
1
· 2 个月前

在没有 root 权限的情况下,关闭自身应用(即脚本当前运行的应用)可以通过以下方法实现:

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

// 方法1:使用系统返回键退出当前应用
for(var i = 0; i < 5; i++) {
    back();
    sleep(500);
}

// 方法2:强制停止当前应用(需要无障碍服务)
function closeCurrentApp() {
    var currentPackage = currentPackage();
    if(currentPackage) {
        app.openAppSetting(currentPackage);
        sleep(1000);
        var stopBtn = textMatches(/(强.*|停.*|结.*)/).findOne(3000);
        if(stopBtn && stopBtn.enabled()) {
            stopBtn.parent().click();
            sleep(500);
            var confirm = textMatches(/(确.*|定.*)/).findOne(3000);
            if(confirm) confirm.click();
        }
        back();
    }
}

// 使用示例
closeCurrentApp();

注意事项:

  1. 方法1通过多次返回操作尝试退出应用,适用于大多数应用
  2. 方法2通过打开应用设置强制停止应用,需要无障碍服务支持
  3. 使用前请确保脚本已获取无障碍服务权限
  4. 强制停止应用可能会导致应用数据丢失,谨慎使用

补充回答 1

在 Hamibot 中,主动释放屏幕录制权限可以通过以下方法实现:

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

// 方法1:调用释放屏幕截图的API
images.stopScreenCapture();

// 方法2:通过脚本结束自动释放
// 脚本运行结束时系统会自动释放权限
hamibot.exit();

// 方法3:无操作超时自动释放
// 当脚本长时间无操作时(约5分钟),系统会自动回收权限

如果需要临时禁用屏幕录制权限但不结束脚本运行,可以使用:

// 暂时禁用并重新请求权限
images.stopScreenCapture();
sleep(1000);
if(!requestScreenCapture()){
    toast("重新获取权限失败");
}

注意事项:

  1. images.stopScreenCapture() 是主动释放权限的标准方法
  2. 脚本正常退出时也会自动释放权限
  3. 部分系统可能有权限缓存,彻底释放可能需要重启设备

补充回答 2

在 Hamibot 中截取长屏(滚动截图)可以通过以下方法实现:

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

auto.waitFor();
// 请求截屏权限
if (!requestScreenCapture()) {
    toast("截图权限获取失败");
    exit();
}

// 获取屏幕宽高
var screenWidth = device.width;
var screenHeight = device.height;
var scrollHeight = screenHeight * 3; // 假设要截3屏高度

// 开始截屏区域(左上角坐标和宽高)
var x = 0, y = 0;
var capturedHeight = 0;
var finalImage = images.createImage(screenWidth, scrollHeight);

while (capturedHeight < scrollHeight) {
    // 截取当前屏幕
    var currentScreen = captureScreen();
    
    // 将当前屏幕拼接到最终图片
    finalImage.drawBitmap(currentScreen, 0, capturedHeight);
    
    // 模拟滑动
    gesture(1000, [screenWidth/2, screenHeight-100], [screenWidth/2, 100]);
    sleep(1000); // 等待滑动完成
    
    capturedHeight += screenHeight;
    
    // 检查是否到达底部
    if (currentScreen.equals(captureScreen())) {
        break;
    }
}

// 保存最终图片
var path = "/sdcard/long_screenshot_" + new Date().getTime() + ".png";
images.save(finalImage, path);
toast("长截图已保存: " + path);

注意事项:

  1. 需要先授予屏幕截图权限
  2. scrollHeight 可根据需要调整要截取的长度
  3. 滑动速度 (gesture 参数) 可能需要根据具体设备调整
  4. 部分应用的UI结构可能影响拼接效果
  5. 建议在稳定的网络环境下操作
ℹ️ 本回答由 AI 生成,内容仅供参考