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 天前

dex文件放在 hamibot 的 assets文件夹 后打包,hamibot安装后,缩写的脚本如何调用里面的dex文件?

第 2 条补充
·
25 天前

22:13:57.070/E: Wrapped com.stardust.pio.UncheckedIOException: java.io.FileNotFoundException: /storage/emulated/0/Hamibot/fishhid.dex (697e0b1da5c74cc1dda8d394.js#16)
Wrapped com.stardust.pio.UncheckedIOException: java.io.FileNotFoundException: /storage/emulated/0/Hamibot/fishhid.dex
at 697e0b1da5c74cc1dda8d394.js:16:0
显示这个错误,怎么修改?

回答

Hamibot AI
1
· 25 天前

遇到蓝牙连接初始化失败的错误,提示需要android.permission.BLUETOOTH_CONNECT权限,这是因为在Android设备上操作蓝牙功能需要相应的权限。Hamibot脚本运行在Android环境中,但Hamibot应用默认可能没有包含所有蓝牙权限。

解决方案:

  1. 检查并授予权限

    • 在设备的「设置」>「应用」>「Hamibot」>「权限」中,确保已启用蓝牙相关的权限(如「蓝牙」或「附近设备」权限)。具体名称可能因Android版本而异(例如,在Android 12及以上,需要BLUETOOTH_CONNECT权限)。
    • 如果权限选项中找不到蓝牙相关项,可能需要通过其他方式授权。
  2. 使用Root权限(如果设备已root)

    • 如果设备已获取root权限,可以在脚本中使用root模式来绕过部分权限限制。例如,通过app.startActivity或其他命令时添加root: true参数(但蓝牙API调用可能仍需底层权限)。
  3. 修改Hamibot APK(高级用户)

    • Hamibot应用默认只支持动态申请少数权限(如位置和录音)。如果需要蓝牙权限,你可以使用APK编辑器(如MT Manager或APK Editor)修改Hamibot的APK,添加BLUETOOTH_CONNECT等权限到AndroidManifest.xml中,然后重新安装。但注意,这可能需要技术知识,且可能违反使用条款。
  4. 脚本中的权限处理

    • Hamibot的runtime.requestPermissions函数目前仅支持申请access_fine_locationrecord_audio权限,不支持蓝牙权限。因此,直接调用runtime.requestPermissions(['bluetooth_connect'])可能无效。
    • 你需要在设备设置中手动授予权限后,再运行脚本。

蓝牙连接代码参考:

在Hamibot脚本中,你可以使用Android的Bluetooth API通过JavaScript调用。以下是一个基本示例,用于获取已配对设备列表(注意:需要先确保权限已授予):

// 文档地址 https://docs.hamibot.com/
// 获取蓝牙适配器
var BluetoothAdapter = android.bluetooth.BluetoothAdapter;
var adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null) {
    log("设备不支持蓝牙");
    exit();
}

// 检查蓝牙是否启用,如果没有启用,可以尝试启用(可能需要用户交互或权限)
if (!adapter.isEnabled()) {
    // 启用蓝牙 - 这可能弹出系统对话框,需要用户确认
    adapter.enable();
    // 等待蓝牙启用,可以添加延时
    sleep(3000);
}

// 获取已配对的设备列表
var bondedDevices = adapter.getBondedDevices();
if (bondedDevices.size() > 0) {
    for (var i = 0; i < bondedDevices.size(); i++) {
        var device = bondedDevices.get(i);
        log("设备名称: " + device.getName() + ", 地址: " + device.getAddress());
    }
} else {
    log("没有找到已配对的蓝牙设备");
}

注意事项:

  • 这段代码尝试获取已配对设备,但如果在没有权限的情况下运行,可能会抛出类似你遇到的权限错误。务必先确保Hamibot应用有蓝牙权限。
  • 蓝牙操作(如连接、通信)需要更复杂的代码,涉及BluetoothSocket等类,具体可参考Android官方文档。
  • 如果问题持续,考虑重启设备或检查蓝牙硬件状态。

如果以上方法无法解决,可能需要等待Hamibot未来版本增加对蓝牙权限的支持,或使用其他自动化工具配合。


补充回答 1

在 Hamibot 中,要调用打包在 assets 文件夹中的 dex 文件,你需要先将该文件复制到应用的可访问目录(如 files/ 目录),然后再使用 runtime.loadDex() 方法进行加载。

以下是具体步骤和示例代码:

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

// 将 assets 中的 dex 文件复制到可访问目录
var sourcePath = "hamibot:assets/你的文件名.dex";
var targetPath = files.path("你的文件名.dex");

// 检查是否已存在,避免重复复制
if (!files.exists(targetPath)) {
    files.copy(sourcePath, targetPath);
}

// 加载 dex 文件
runtime.loadDex(targetPath);

// 之后你可以使用 dex 文件中的类
// 例如:importClass(com.example.YourClass);

注意事项:

  1. 确保 dex 文件名称正确且已打包到 assets 中
  2. hamibot:assets/ 是访问 assets 目录的特殊前缀
  3. 建议在复制前检查目标文件是否存在,避免不必要的文件操作
  4. 加载成功后即可使用 importClass 来导入 dex 中的类

如果遇到问题,请检查文件路径是否正确以及 dex 文件是否完整无损。


补充回答 2

根据错误信息,问题在于文件 /storage/emulated/0/Hamibot/fishhid.dex 找不到。这通常是因为在复制文件从 assets 到目标路径时失败,或者源文件路径不正确。以下是修改建议和代码调整:

可能的原因和解决方案:

  1. 源文件路径错误:确保使用 "hamibot:assets/fishhid.dex" 来访问打包在 assets 中的文件。Hamibot 使用特殊前缀 hamibot:assets/ 来引用 assets 目录。
  2. 文件未正确打包:确认 fishhid.dex 文件已正确添加到脚本的 assets 文件夹中,并且脚本打包时包含此文件。
  3. 目标路径权限问题:Hamibot 通常有写入存储的权限,但确保目标目录可访问。
  4. 添加错误处理:在复制前检查源文件是否存在,避免盲目复制。

修改后的代码示例:

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

var sourcePath = "hamibot:assets/fishhid.dex";
var targetPath = files.path("fishhid.dex");

// 检查源文件是否存在
if (!files.exists(sourcePath)) {
    toast("错误:assets 中未找到 fishhid.dex 文件");
    hamibot.exit(); // 退出脚本
}

// 检查目标文件是否存在,如果不存在则复制
if (!files.exists(targetPath)) {
    var success = files.copy(sourcePath, targetPath);
    if (!success) {
        toast("复制文件失败");
        hamibot.exit();
    }
}

// 加载 dex 文件
try {
    runtime.loadDex(targetPath);
    toast("dex 文件加载成功");
} catch (e) {
    toast("加载 dex 文件失败: " + e.message);
    hamibot.exit();
}

// 之后可以使用 dex 中的类,例如:importClass(com.example.YourClass);

说明:

  • 使用 files.exists(sourcePath) 检查 assets 中的文件是否存在。如果返回 false,说明文件未打包或路径错误。
  • files.copy 返回布尔值表示成功与否,添加检查以确保复制操作成功。
  • 使用 try-catch 块捕获 runtime.loadDex 可能抛出的异常。
  • 确保文件名大小写匹配(如 fishhid.dex 而不是 FishHid.dex),因为文件系统可能区分大小写。

如果问题仍然存在,请检查:

  • 脚本打包时是否确实包含了 fishhid.dex 在 assets 文件夹中。
  • Hamibot 应用是否有存储读写权限(通常在应用设置中授予)。

这应该能解决文件找不到的错误。

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