uni-app android14版本下经典蓝牙获取已配置列表时,plus.android.importClass报错

uni-app android14版本下经典蓝牙获取已配置列表时,plus.android.importClass报错

信息类别 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 windows11
HBuilderX类型 正式
HBuilderX版本号 4.08
手机系统 Android
手机系统版本号 Android 14
手机厂商 OPPO
手机机型 OPPO Find X7
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

示例代码:

const flushedEquipment = () => {
var main = plus.android.runtimeMainActivity();
var Context = plus.android.importClass("android.content.Context");
var BManager = main.getSystemService(Context.BLUETOOTH_SERVICE);
plus.android.importClass(BManager); //引入相关的method函数
var BAdapter = BManager.getAdapter();
plus.android.importClass(BAdapter);//引入相关的method函数,这样之后才会有isEna
var lists = BAdapter.getBondedDevices();
plus.android.importClass(lists);
var iterator = lists.iterator();
plus.android.importClass(iterator);
while(iterator.hasNext()) {
var d = iterator.next();
plus.android.importClass(d);
console.log("名称:"+d.getName()+",地址:"+d.getAddress());
}
}

操作步骤:

android14真机调试执行上面代码即可

预期结果:

获取到已匹配蓝牙设备列表

实际结果:

报错Cannot read property ‘TYPE’ of null


更多关于uni-app android14版本下经典蓝牙获取已配置列表时,plus.android.importClass报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

HUAWEI Mate 30E也有这个问题

更多关于uni-app android14版本下经典蓝牙获取已配置列表时,plus.android.importClass报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


解决了吗

你好,请问怎么解决的。

在 uni-app 中,使用 plus.android.importClass 导入 Android 的类时,可能会遇到兼容性问题,尤其是在较新的 Android 版本(如 Android 14)中。以下是一些可能的原因和解决方案:


问题原因

  1. Android 版本兼容性

    • 在 Android 14 中,某些 API 或类可能已被弃用或修改,导致 plus.android.importClass 无法正确导入。
  2. 权限问题

    • 蓝牙功能需要特定的权限,如果权限未正确配置,可能会导致问题。
  3. uni-app 插件或 SDK 版本问题

    • 如果使用的 uni-app 插件或 SDK 版本较旧,可能不支持最新的 Android 版本。
  4. 代码逻辑问题

    • 代码中可能存在逻辑错误,例如未正确初始化蓝牙适配器或未检查设备是否支持蓝牙。

解决方案

1. 检查权限配置

确保在 manifest.json 中正确配置了蓝牙权限:

{
  "permissions": {
    "android": [
      "BLUETOOTH",
      "BLUETOOTH_ADMIN",
      "ACCESS_FINE_LOCATION"
    ]
  }
}

在 Android 10 及以上版本,还需要动态申请定位权限:

uni.authorize({
  scope: 'scope.userLocation',
  success() {
    console.log('定位授权成功');
  },
  fail() {
    console.log('定位授权失败');
  }
});

2. 使用最新的 uni-app SDK 和插件

确保 uni-app SDK 和插件是最新版本,以支持最新的 Android 版本。

3. 检查代码逻辑

确保在调用蓝牙功能之前,已经正确初始化蓝牙适配器,并检查设备是否支持蓝牙。例如:

const BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter');
const adapter = BluetoothAdapter.getDefaultAdapter();

if (!adapter) {
  console.log('设备不支持蓝牙');
  return;
}

if (!adapter.isEnabled()) {
  console.log('蓝牙未开启');
  return;
}

// 获取已配置的蓝牙设备列表
const pairedDevices = adapter.getBondedDevices();
const deviceList = [];
const iterator = pairedDevices.iterator();
while (iterator.hasNext()) {
  const device = iterator.next();
  deviceList.push({
    name: device.getName(),
    address: device.getAddress()
  });
}
console.log('已配置的蓝牙设备列表:', deviceList);

4. 处理 plus.android.importClass 错误

如果 plus.android.importClass 报错,可以尝试以下方法:

  • 检查类名是否正确。
  • 使用 try-catch 捕获错误:
    try {
      const BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter');
    } catch (error) {
      console.error('导入类失败:', error);
    }
    

5. 使用 HBuilderX 调试

使用 HBuilderX 的调试功能,查看具体的错误信息,定位问题。

6. 替代方案:使用原生插件

如果 uni-app 的蓝牙功能无法满足需求,可以考虑开发原生插件,直接调用 Android 的蓝牙 API。


示例代码

以下是一个完整的示例,用于获取已配置的蓝牙设备列表:

function getPairedDevices() {
  try {
    const BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter');
    const adapter = BluetoothAdapter.getDefaultAdapter();

    if (!adapter) {
      console.log('设备不支持蓝牙');
      return;
    }

    if (!adapter.isEnabled()) {
      console.log('蓝牙未开启');
      return;
    }

    const pairedDevices = adapter.getBondedDevices();
    const deviceList = [];
    const iterator = pairedDevices.iterator();
    while (iterator.hasNext()) {
      const device = iterator.next();
      deviceList.push({
        name: device.getName(),
        address: device.getAddress()
      });
    }
    console.log('已配置的蓝牙设备列表:', deviceList);
    return deviceList;
  } catch (error) {
    console.error('获取蓝牙设备列表失败:', error);
    return [];
  }
}

// 调用函数
getPairedDevices();
回到顶部