当执行唤醒设备命令后,怎么根据不同分辨率的设备获取密码解锁键盘数字的具体位置并执行点击。能够兼容不同设备的方案,不只是获取某种分辨率下数字的固定坐标进行点击。

已存档
JuN7 · 1 个月前
第 1 条补充
·
1 个月前

不同设备类型可能密码数字按键位置比利不同,使用setScreenMetrics()也无法兼容全部情况,请问还有什么能准备识别各个设备解锁页面数字键盘的准确位置并点击的方法和最佳实践。

第 2 条补充
·
1 个月前

基于图像识别方法,原理是调用的什么api,通过识别解锁键盘数字键的颜色还是文字?

回答

Hamibot AI
1
· 1 个月前

兼容不同分辨率设备的密码解锁键盘点击方案

要实现兼容不同分辨率设备的密码解锁键盘点击,不能简单使用固定坐标。以下提供两种可靠方案:

方案一:使用setScreenMetrics()进行坐标自适应

这是最简单有效的方案,通过设置基准分辨率让Hamibot自动处理坐标缩放:

// 文档地址 https://docs.hamibot.com/
// 设置设计时的基准分辨率(例如1080x1920)
setScreenMetrics(1080, 1920);

// 在基准分辨率下确定各数字位置(单位:像素)
// 这些坐标需要在1080x1920设备上实际测量
var keyPositions = {
  1: [270, 1300],
  2: [540, 1300],
  3: [810, 1300],
  4: [270, 1450],
  5: [540, 1450],
  6: [810, 1450],
  7: [270, 1600],
  8: [540, 1600],
  9: [810, 1600],
  0: [540, 1750]
};

// 点击指定数字
function clickNumber(num) {
  var pos = keyPositions[num];
  if (pos) {
    click(pos[0], pos[1]);
    sleep(200); // 确保点击完成
  }
}

// 示例:输入密码123456
clickNumber(1);
clickNumber(2);
clickNumber(3);
clickNumber(4);
clickNumber(5);
clickNumber(6);

关键说明

  • setScreenMetrics(1080, 1920) 必须在脚本开始时调用
  • 坐标值需要在1080x1920分辨率设备上实际测量
  • Hamibot会自动将坐标适配到当前设备分辨率(如在540x960设备上,坐标会自动减半)

方案二:基于图像识别的精准定位

当设备解锁界面差异较大时,可使用图像识别更精准定位:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

if (!requestScreenCapture()) {
  toastLog('请授予屏幕截图权限');
  hamibot.exit();
}

sleep(1000);
var img = captureScreen();

// 定义寻找数字的函数(以数字1为例)
function findNumberPosition(num) {
  // 根据不同设备调整颜色值,这里以白色数字为例
  var baseColor = '#FFFFFF';
  var offsets = [
    [5, 5, '#FFFFFF'],  // 相对坐标和颜色
    [10, 10, '#FFFFFF']
  ];
  
  // 仅在屏幕下半部分搜索(提高效率)
  var region = [0, device.height * 0.6, device.width, device.height * 0.4];
  
  var p = images.findMultiColors(
    img,
    baseColor,
    offsets,
    {
      region: region,
      threshold: 4
    }
  );
  
  return p;
}

// 点击数字函数
function clickNumber(num) {
  var pos = findNumberPosition(num);
  if (pos) {
    click(pos.x, pos.y);
    toastLog('成功点击数字 ' + num);
    sleep(200);
    return true;
  }
  toastLog('未找到数字 ' + num);
  return false;
}

// 输入密码
function enterPassword(password) {
  for (var i = 0; i < password.length; i++) {
    var num = parseInt(password.charAt(i));
    if (num >= 0 && num <= 9) {
      clickNumber(num);
    }
  }
}

// 使用示例
enterPassword("123456");
hamibot.exit();

实用建议

  1. 最佳实践:结合两种方案,先尝试图像识别,失败时使用setScreenMetrics()方案

    // 尝试图像识别,失败则用坐标方案
    function getNumberPosition(num) {
      var pos = findNumberPosition(num);
      if (!pos) {
        // 回退到坐标方案
        pos = {
          x: keyPositions[num][0],
          y: keyPositions[num][1]
        };
      }
      return pos;
    }
    
  2. 测试方法

    • 在不同分辨率设备上运行脚本前,先在1080x1920设备上确定基准坐标
    • 使用"布局分析"工具查看解锁界面,确定数字位置
    • 调整region参数缩小搜索范围,提高识别速度
  3. 注意事项

    • 图像识别需要开启截图权限(requestScreenCapture())
    • 不同品牌设备解锁界面差异大,可能需要为各品牌准备不同的颜色参数
    • 在脚本开头调用setScreenMetrics()是解决分辨率问题的最简单方法

这两种方案都能有效解决不同分辨率设备的兼容性问题,推荐优先使用setScreenMetrics()方案,它更简单且执行效率更高。图像识别方案可作为补充,适用于界面差异极大的情况。


补充回答 1

对于解锁页面数字键盘的准确定位问题,setScreenMetrics()确实可能不足以处理所有设备类型,因为不同厂商的解锁键盘布局比例可能存在较大差异。以下是一些更可靠的方法和最佳实践:

1. 图像识别定位法(推荐)

解锁键盘的数字通常具有特定的视觉特征,使用图像识别是最可靠的方法:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
    toastLog('请授予屏幕截图权限');
    hamibot.exit();
}

// 截取当前屏幕
var img = captureScreen();

// 定义查找数字"1"的方法
function findDigitPosition(digit) {
    // 不同设备数字颜色可能不同,这里使用常见颜色范围
    var colors = {
        '1': '#333333', // 常见数字颜色
        '2': '#333333',
        '3': '#333333'
        // 添加其他数字...
    };
    
    // 设置搜索区域(通常是屏幕下半部分)
    var searchRegion = [0, height*0.4, width, height*0.6];
    
    // 查找数字位置
    var p = images.findColor(
        img,
        colors[digit],
        {
            region: searchRegion,
            threshold: 4
        }
    );
    
    if (p) {
        return p;
    }
    
    // 如果单色查找失败,尝试多点颜色匹配(更精确)
    return images.findMultiColors(
        img,
        colors[digit],
        [
            [5, 5, colors[digit]],
            [10, 10, colors[digit]]
        ],
        {
            region: searchRegion
        }
    );
}

// 使用示例:点击数字1
var pos = findDigitPosition('1');
if (pos) {
    click(pos.x, pos.y);
    toastLog('已点击数字1');
} else {
    toastLog('未找到数字1');
}

hamibot.exit();

2. 模板匹配法

为常见设备类型准备多个坐标模板:

// 文档地址 https://docs.hamibot.com/
function getKeyboardLayout() {
    var width = device.width;
    var height = device.height;
    
    // 根据屏幕比例选择模板
    var ratio = width / height;
    
    if (ratio > 0.5 && ratio < 0.6) {
        // 常见18:9屏幕
        return {
            keyWidth: width / 3,
            keyHeight: height * 0.07,
            startX: width * 0.15,
            startY: height * 0.65
        };
    } else if (ratio > 0.4 && ratio < 0.5) {
        // 其他比例屏幕
        return {
            keyWidth: width / 3,
            keyHeight: height * 0.06,
            startX: width * 0.1,
            startY: height * 0.7
        };
    }
    // 默认模板
    return {
        keyWidth: width / 3,
        keyHeight: height * 0.07,
        startX: width * 0.15,
        startY: height * 0.65
    };
}

// 获取数字位置(假设3x4布局)
function getDigitPosition(digit, layout) {
    var row, col;
    
    switch(digit) {
        case '1': row = 0; col = 0; break;
        case '2': row = 0; col = 1; break;
        case '3': row = 0; col = 2; break;
        case '4': row = 1; col = 0; break;
        // 其他数字...
        default: row = 3; col = 1; // 0的位置
    }
    
    return {
        x: layout.startX + col * layout.keyWidth + layout.keyWidth/2,
        y: layout.startY + row * layout.keyHeight + layout.keyHeight/2
    };
}

3. 最佳实践建议

  1. 组合使用多种方法:先尝试图像识别,失败后再用模板匹配
  2. 动态校准:首次运行时让用户确认几个关键点位置,建立设备专属坐标系
  3. 错误处理:添加重试机制和失败处理逻辑
  4. 安全考虑:解锁操作可能受系统限制,某些设备需要root权限才能操作锁屏
  5. 布局分析:对于特定设备,可以先截图分析键盘布局规律

4. 高级技巧

对于特别复杂的解锁界面,可以考虑:

// 文档地址 https://docs.hamibot.com/
function smartClickDigit(digit) {
    // 方法1: 尝试图像识别
    var pos = findDigitPosition(digit);
    if (pos) {
        click(pos.x, pos.y);
        return true;
    }
    
    // 方法2: 尝试模板匹配
    var layout = getKeyboardLayout();
    pos = getDigitPosition(digit, layout);
    click(pos.x, pos.y);
    sleep(500);
    
    // 验证是否点击成功(例如检查是否有震动反馈或界面变化)
    var imgAfter = captureScreen();
    // 这里可以添加验证逻辑...
    
    return true;
}

注意:某些设备出于安全考虑,可能禁止自动化工具操作锁屏界面,这种情况下可能需要root权限或设备特定的解决方案。在开发前请确认目标设备是否支持此类操作。


补充回答 2

基于图像识别方法定位解锁键盘数字键,Hamibot主要提供两种API实现方式:

1. 颜色识别API(最常用)

使用images.findColor()images.findMultiColors()等API,原理是通过识别数字的颜色特征来定位:

// 文档地址 https://docs.hamibot.com/
// 单点颜色查找
var p = images.findColor(
    img, 
    "#333333",  // 常见数字颜色
    {
        region: [0, height*0.4, width, height*0.6],
        threshold: 4
    }
);

// 多点颜色匹配(更精确)
var p = images.findMultiColors(
    img,
    "#333333",  // 首颜色
    [
        [5, 5, "#333333"],  // 相对位置1的颜色
        [10, 10, "#333333"] // 相对位置2的颜色
    ],
    {
        region: [0, height*0.4, width, height*0.6]
    }
);

工作原理

  • 先截取屏幕图像captureScreen()
  • 在指定区域内搜索目标颜色
  • 使用threshold参数控制颜色匹配精度(0-255,值越小越精确)
  • 多点找色通过验证多个相对位置的颜色来提高准确性,避免误匹配

优点

  • 执行速度快(毫秒级)
  • 对设备性能要求低
  • 不需要网络连接

缺点

  • 不同设备数字颜色可能不同
  • 易受屏幕亮度、主题变化影响
  • 无法区分具体是哪个数字(只能知道有深色块)

2. OCR文字识别API

使用ocr.recognize()ocr.recognizeText(),原理是通过识别数字键上的文字内容:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
    toastLog('请授予屏幕截图权限');
    hamibot.exit();
}
var img = captureScreen();
var res = ocr.recognize(img);
log(res); // 返回识别结果数组,包含文字及位置信息

工作原理

  • 截取屏幕区域图像
  • 使用OCR引擎分析图像中的文字
  • 返回识别到的文字及其在屏幕上的坐标位置

优点

  • 能准确识别具体是哪个数字
  • 不受颜色变化影响
  • 适用于不同主题的设备

缺点

  • 识别速度较慢(可能需要几百毫秒)
  • 对图像清晰度要求较高
  • 小字体或模糊数字可能识别失败

最佳实践建议

对于解锁键盘定位,推荐优先使用颜色识别+多点验证的组合方法:

  1. 首选方案findMultiColors() + 动态阈值调整

    • 通过查找数字中心点及其周围特征点的颜色
    • 设置合理的threshold值(通常2-8)适应不同设备
  2. 备用方案:当颜色识别不稳定时,使用OCR识别特定区域

    • 限制OCR识别区域为键盘区域,提高准确性和速度
    • 对识别结果进行位置验证,确保点击的是数字键
  3. 增强可靠性

    // 文档地址 https://docs.hamibot.com/
    function locateDigit(digit) {
        // 尝试3次不同阈值
        for (var t = 2; t <= 6; t += 2) {
            var p = images.findMultiColors(
                img,
                digitColor,  // 数字颜色
                digitPatterns[digit], // 预定义的多点模式
                {threshold: t}
            );
            if (p) return p;
        }
        return null;
    }
    

实际应用中,由于解锁键盘的数字颜色通常比较一致(深色),而位置布局有规律,颜色识别方法在速度和可靠性上通常优于OCR,是解锁场景的首选方案。

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