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
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)中。以下是一些可能的原因和解决方案:
问题原因
-
Android 版本兼容性:
- 在 Android 14 中,某些 API 或类可能已被弃用或修改,导致
plus.android.importClass
无法正确导入。
- 在 Android 14 中,某些 API 或类可能已被弃用或修改,导致
-
权限问题:
- 蓝牙功能需要特定的权限,如果权限未正确配置,可能会导致问题。
-
uni-app 插件或 SDK 版本问题:
- 如果使用的 uni-app 插件或 SDK 版本较旧,可能不支持最新的 Android 版本。
-
代码逻辑问题:
- 代码中可能存在逻辑错误,例如未正确初始化蓝牙适配器或未检查设备是否支持蓝牙。
解决方案
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();