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连接蓝牙有什么替代方法?
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运行,不能的话能否修改一下?
出现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 无法直接操作蓝牙,因为涉及到系统级权限限制。不过你可以通过以下两种方法实现蓝牙控制:
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();
主要修改点:
- 文件加载:将
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()。 - 日志输出:将所有
console.log替换为log(),因为 Hamibot 使用 Rhino 引擎,不支持console对象。 - 权限处理:代码中提到的蓝牙权限错误(
Need android.permission.BLUETOOTH_CONNECT permission)需要你在设备设置中手动授予 Hamibot 应用蓝牙权限。进入系统设置 → 应用 → Hamibot → 权限,确保蓝牙权限已开启。如果设备已 root,可以考虑使用shell()命令绕过限制。 - 路径检查:确保 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_location和record_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 或以下),可能需要其他权限如BLUETOOTH或BLUETOOTH_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 命令。