14:29:11.523/D: 蓝牙/USB 连接初始化结果:连接失败: 初始化连接异常: Need android.permission.BLUETOOTH_CONNECT permission for android.content.AttributionSource@9a33db7b App with package name:com.ffdz.ybilg: AdapterService getBondedDevices
hamibot连接蓝牙有什么替代方法?

已存档
测试脚本 · 25 天前
第 1 条补充
·
25 天前

runtime.loadDex('/sdcard/Download/fishhid.apk');
importClass(com.fishhidpro.hid.HidBridge);

var Hid = null;
// 参数,0是usb模式, 1是蓝牙模式
function HID_init(hid_type){
console.log("========== 开始初始化 fishhid ==========");
// 1. 检查 Hid 是否未实例化
if(Hid === null){
Hid = new HidBridge();
console.log("HidBridge 实例创建成功");
}

// 2. 检查 SO 文件是否存在
var soPath = "/sdcard/Download/lib/arm64-v8a/libnetwork-lib.so";
if (!files.exists(soPath)) {
    console.log("错误:SO 文件不存在!路径:" + soPath);
    return false;
}
console.log("SO 文件存在,准备加载:" + soPath);

// 3. 加载 SO 文件
var soLoadResult = Hid.initialize(context, soPath);
console.log("SO 文件加载结果:" + soLoadResult);
if(!soLoadResult){
    console.log("错误:SO 文件加载失败");
    return false;
}

// 4. 初始化蓝牙/USB 连接(延长超时至 20 秒)
var connectTimeout = 20000; // 20 秒超时
var connectResult = false;
if(hid_type===1){
    console.log("准备初始化蓝牙模式,超时时间:" + connectTimeout + " 毫秒");
    connectResult = Hid.init("bluetooth", connectTimeout);
}else{
    console.log("准备初始化 USB 模式,超时时间:" + connectTimeout + " 毫秒");
    connectResult = Hid.init("usb", connectTimeout);
}
console.log("蓝牙/USB 连接初始化结果:" + connectResult);

return connectResult;

}

function GetMac(){
// 增加容错:避免 Hid 为 null 时报错
if (Hid === null) {
console.log("错误:Hid 实例未创建,无法获取 MAC 地址");
return "Hid 实例为空";
}
var mac = Hid.getMac();
console.log("获取到 MAC 地址:" + (mac || "null(未获取到)"));
return mac;
}

function main(){
// 修复:移除 Hamibot 不支持的 os.arch() 调用
console.log("========== 开始执行 main 函数 ==========");

if(!HID_init(1)){  // 初始化为蓝牙模式,超时 20 秒
    console.log("========== 初始化失败 ==========");
    return;
}
console.log("========== 初始化完成,获取 MAC 地址 ==========");
console.log("mac:"+GetMac());

}

main(); 这代码能否在hamibot运行,不能的话能否修改一下?

第 2 条补充
·
25 天前

出现14:29:11.523/D: 蓝牙/USB 连接初始化结果:连接失败: 初始化连接异常: Need android.permission.BLUETOOTH_CONNECT permission for android.content.AttributionSource@9a33db7b App with package name:com.ffdz.ybilg: AdapterService getBondedDevices

回答

Hamibot AI
1
· 25 天前

Hamibot 无法直接操作蓝牙,因为涉及到系统级权限限制。不过你可以通过以下两种方法实现蓝牙控制:

1. 使用 root 权限执行 shell 命令(需要设备已 root)

// 开启蓝牙
shell('svc bluetooth enable', true);

// 扫描蓝牙设备
shell('am start -a android.bluetooth.adapter.action.REQUEST_DISCOVERABLE', true);

// 连接指定设备(需要知道设备MAC地址)
shell('bt-pan connect 00:11:22:33:44:55', true);

2. 使用 USB 蓝牙适配器(无需 root)

  • 通过 OTG 连接 USB 蓝牙适配器
  • 在 Hamibot 脚本中模拟物理按键操作系统蓝牙界面
  • 结合 OCR 识别或坐标点击来实现蓝牙设备的连接管理

建议先检查你的脚本是否已申请蓝牙相关权限,并在设备设置中手动授予 Hamibot 蓝牙权限。如果仍有问题,使用 shell 命令方式需要确保设备已获取 root 权限。


补充回答 1

你的代码在 Hamibot 中运行时可能会遇到几个问题,主要涉及文件加载、日志输出和权限处理。以下是修改后的代码,使其兼容 Hamibot 环境:

修改后的代码:

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

// 加载 dex 文件(注意:APK 文件需要先转换为 dex 格式)
runtime.loadDex('/sdcard/Download/fishhid.dex'); // 将 APK 转换为 dex 文件,路径相应修改
importClass(com.fishhidpro.hid.HidBridge);

var Hid = null;

function HID_init(hid_type) {
    log("========== 开始初始化 fishhid ==========");
    
    // 1. 检查 Hid 是否未实例化
    if (Hid === null) {
        Hid = new HidBridge();
        log("HidBridge 实例创建成功");
    }
    
    // 2. 检查 SO 文件是否存在
    var soPath = "/sdcard/Download/lib/arm64-v8a/libnetwork-lib.so";
    if (!files.exists(soPath)) {
        log("错误:SO 文件不存在!路径:" + soPath);
        return false;
    }
    log("SO 文件存在,准备加载:" + soPath);
    
    // 3. 加载 SO 文件
    var soLoadResult = Hid.initialize(context, soPath);
    log("SO 文件加载结果:" + soLoadResult);
    if (!soLoadResult) {
        log("错误:SO 文件加载失败");
        return false;
    }
    
    // 4. 初始化蓝牙/USB 连接(延长超时至 20 秒)
    var connectTimeout = 20000; // 20 秒超时
    var connectResult = false;
    if (hid_type === 1) {
        log("准备初始化蓝牙模式,超时时间:" + connectTimeout + " 毫秒");
        connectResult = Hid.init("bluetooth", connectTimeout);
    } else {
        log("准备初始化 USB 模式,超时时间:" + connectTimeout + " 毫秒");
        connectResult = Hid.init("usb", connectTimeout);
    }
    log("蓝牙/USB 连接初始化结果:" + connectResult);
    
    return connectResult;
}

function GetMac() {
    if (Hid === null) {
        log("错误:Hid 实例未创建,无法获取 MAC 地址");
        return "Hid 实例为空";
    }
    var mac = Hid.getMac();
    log("获取到 MAC 地址:" + (mac || "null(未获取到)"));
    return mac;
}

function main() {
    log("========== 开始执行 main 函数 ==========");
    
    if (!HID_init(1)) {  // 初始化为蓝牙模式,超时 20 秒
        log("========== 初始化失败 ==========");
        return;
    }
    log("========== 初始化完成,获取 MAC 地址 ==========");
    log("mac:" + GetMac());
}

main();

主要修改点:

  1. 文件加载:将 runtime.loadDex('/sdcard/Download/fishhid.apk') 改为 runtime.loadDex('/sdcard/Download/fishhid.dex')。APK 文件不能直接作为 DEX 加载,你需要先将 APK 中的 classes.dex 提取出来或使用 Android SDK 的 dx 工具转换 JAR 到 DEX。如果原始文件是 JAR,使用 runtime.loadJar()
  2. 日志输出:将所有 console.log 替换为 log(),因为 Hamibot 使用 Rhino 引擎,不支持 console 对象。
  3. 权限处理:代码中提到的蓝牙权限错误(Need android.permission.BLUETOOTH_CONNECT permission)需要你在设备设置中手动授予 Hamibot 应用蓝牙权限。进入系统设置 → 应用 → Hamibot → 权限,确保蓝牙权限已开启。如果设备已 root,可以考虑使用 shell() 命令绕过限制。
  4. 路径检查:确保 SO 文件路径正确,且 Hamibot 有权限访问 /sdcard/Download/ 目录。

额外建议:

  • 如果初始化仍然失败,检查设备是否支持蓝牙 HID 模式,以及 SO 文件是否与设备架构(如 arm64-v8a)匹配。
  • 考虑添加错误处理和重试机制,例如在初始化失败时重试几次。
  • 如果使用蓝牙模式,确保设备蓝牙已开启并可被发现。

如果问题持续,可能需要检查 HidBridge 库的兼容性或联系库的开发者。


补充回答 2

你的代码在尝试初始化蓝牙连接时遇到了权限错误,具体是缺少 BLUETOOTH_CONNECT 权限。这个权限在 Android 12(API 级别 31)及更高版本中 required 用于蓝牙操作。Hamibot 应用默认可能没有声明或获取此权限,因此需要手动处理。

错误分析:

  • 错误信息Need android.permission.BLUETOOTH_CONNECT permission 表明应用(包名 com.ffdz.ybilg,这可能是 Hamibot 的变体或自定义版本)没有足够的权限访问蓝牙设备。
  • 根本原因:在 Android 6.0+ 设备上,敏感权限如蓝牙权限需要动态请求或在应用设置中手动授予。Hamibot 的 runtime.requestPermissions() 仅支持有限权限(如 access_fine_locationrecord_audio),不包括蓝牙权限。

解决方案:

1. 手动授予蓝牙权限(首选方法)

  • 进入设备的设置 > 应用 > Hamibot(或对应包名的应用)> 权限
  • 找到并启用蓝牙蓝牙连接相关的权限(具体名称可能因设备而异,例如 "蓝牙"、"Bluetooth"、"Bluetooth connect")。
  • 重启 Hamibot 应用后重试代码。

2. 使用 Root 权限执行 Shell 命令(如果设备已 Root)

  • 如果设备已 Root,可以通过 shell() 命令强制授予权限或直接控制蓝牙:
    // 授予 BLUETOOTH_CONNECT 权限(需要包名)
    shell("pm grant com.ffdz.ybilg android.permission.BLUETOOTH_CONNECT", true);
    
    // 或者直接启用蓝牙并操作(无需权限申请)
    shell("svc bluetooth enable", true); // 启用蓝牙
    shell("am start -a android.bluetooth.adapter.action.REQUEST_DISCOVERABLE", true); // 使设备可发现
    
  • 注意:替换 com.ffdz.ybilg 为实际包名(如果不同)。

3. 改用 USB 模式

  • 如果你的蓝牙设备支持 USB 连接,可以尝试使用 USB 模式以避免蓝牙权限问题:
    // 在 HID_init 函数中,使用 USB 模式
    HID_init(0); // 参数 0 表示 USB 模式
    
  • 确保设备通过 OTG 连接 USB 蓝牙适配器,并在系统中已安装驱动。

4. 检查 Android 版本和权限兼容性

  • Android 12+ 严格要求 BLUETOOTH_CONNECT 权限。如果设备版本较低(Android 11 或以下),可能需要其他权限如 BLUETOOTHBLUETOOTH_ADMIN。你可以尝试授予这些权限:
    shell("pm grant com.ffdz.ybilg android.permission.BLUETOOTH", true);
    shell("pm grant com.ffdz.ybilg android.permission.BLUETOOTH_ADMIN", true);
    

修改后的代码建议:

在运行主代码前,添加权限检查或 Root 命令:

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

// 尝试授予权限(仅限 Root 设备)
if (device.isRoot()) {
    shell("pm grant com.ffdz.ybilg android.permission.BLUETOOTH_CONNECT", true);
    shell("pm grant com.ffdz.ybilg android.permission.BLUETOOTH", true);
    log("已尝试授予蓝牙权限");
} else {
    log("设备未 Root,请手动在设置中授予蓝牙权限");
}

// 然后继续你的原有代码...
runtime.loadDex('/sdcard/Download/fishhid.dex');
importClass(com.fishhidpro.hid.HidBridge);
// ... 其余代码不变

额外提示:

  • 包名确认:确保错误中的包名 com.ffdz.ybilg 与你的 Hamibot 应用匹配。如果不匹配,可能需要调整权限授予命令中的包名。
  • 文件路径:确保 fishhid.dex 文件存在(APK 需先转换为 DEX 格式),且 SO 文件路径正确。
  • 日志查看:使用 log() 代替 console.log 来输出日志,以便在 Hamibot 中查看。

如果以上方法仍无法解决问题,可能需要考虑使用 Intent 或辅助功能来间接控制蓝牙,但这可能更复杂。优先尝试手动授予权限或使用 Root 命令。

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