uniapp在安卓13中调用writeblecharacteristicvalue写入失败如何解决?

在uniapp开发中,安卓13设备调用writeblecharacteristicvalue写入蓝牙特征值时失败,返回错误码或没有任何响应。已确认蓝牙权限已开启,服务UUID和特征值UUID正确,在安卓12及以下版本正常写入。请问如何解决安卓13的兼容性问题?是否需要特殊配置或权限?

2 回复

检查蓝牙权限,确保在AndroidManifest.xml中声明了BLUETOOTH_ADVERTISE和BLUETOOTH_CONNECT权限。同时确认设备已配对连接,且特征值支持写入操作。


在 Android 13 中,UniApp 调用 writeCharacteristicValue 写入失败通常是由于蓝牙权限或 API 行为变更导致的。以下是常见原因及解决方案:


1. 检查 Android 13 蓝牙权限

Android 13 引入了更细粒度的蓝牙权限:

  • 必需权限(在 manifest.json 中配置):

    {
      "permissions": [
        "android.permission.BLUETOOTH",
        "android.permission.BLUETOOTH_ADMIN",
        "android.permission.ACCESS_FINE_LOCATION" // 仅限 Android 12 及以下
      ]
    }
    

    注意:Android 13 移除了定位权限要求,但需添加以下新权限:

    {
      "permissions": [
        "android.permission.BLUETOOTH_SCAN",
        "android.permission.BLUETOOTH_CONNECT",
        "android.permission.BLUETOOTH_ADVERTISE" // 可选,仅广播时需要
      ]
    }
    
  • 动态申请权限(在代码中调用):

    // 在 UniApp 的 JS 中检查并申请权限
    plus.android.requestPermissions(
      ['android.permission.BLUETOOTH_SCAN', 'android.permission.BLUETOOTH_CONNECT'],
      function(result) {
        console.log('权限申请结果:', result);
      },
      function(error) {
        console.error('权限申请失败:', error);
      }
    );
    

2. 确认特征值(Characteristic)属性

确保目标特征值支持写入操作:

  • 检查特征值的 properties 是否包含 writewriteWithoutResponse
  • 示例代码:
    const characteristic = service.characteristics.find(c => c.uuid === '目标UUID');
    if (characteristic.properties.write || characteristic.properties.writeWithoutResponse) {
      // 执行写入操作
      device.writeCharacteristicValue({
        serviceId: service.uuid,
        characteristicId: characteristic.uuid,
        value: arrayBuffer,
        success: () => console.log('写入成功'),
        fail: (err) => console.error('写入失败:', err)
      });
    }
    

3. 使用正确的写入类型

根据特征值属性选择写入方式:

  • 有响应写入(需对方确认):
    device.writeCharacteristicValue({
      writeType: 'write', // 默认值
      // ... 其他参数
    });
    
  • 无响应写入(高速写入,不保证到达):
    device.writeCharacteristicValue({
      writeType: 'writeWithoutResponse',
      // ... 其他参数
    });
    

4. 处理 Android 13 的兼容性

  • 更新 UniApp 和 HBuilderX:确保使用最新版本以兼容 Android 13。
  • 检查设备系统权限:在手机设置中手动授予 UniApp 蓝牙权限。

5. 错误排查步骤

  1. fail 回调中打印详细错误信息:
    device.writeCharacteristicValue({
      // ... 参数
      fail: (err) => {
        console.error('错误代码:', err.code, '错误信息:', err.errMsg);
      }
    });
    
  2. 常见错误码:
    • 10000:未初始化蓝牙适配器。
    • 10008:特征值不支持该操作。

通过以上步骤,可解决大部分 Android 13 下的写入失败问题。若仍无法解决,请提供具体错误日志以便进一步分析。

回到顶部