uni-app uts调用鸿蒙低功耗蓝牙扫描APP闪退

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app uts调用鸿蒙低功耗蓝牙扫描APP闪退

开发环境 版本号 项目创建方式
Windows win10 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:Alpha

HBuilderX版本号:4.36

手机系统:HarmonyOS NEXT

手机系统版本号:HarmonyOS NEXT Developer Beta1

手机厂商:华为

手机机型:Mate 60

页面类型:vue

vue版本:vue3

打包方式:离线

示例代码:

import { OnBluetoothDeviceFoundOptions, OnBluetoothDeviceFoundCallback } from ‘…/…/interface.uts’

import { DevicesOptions } from ‘…/type.uts’

import { ble } from ‘@kit.ConnectivityKit’; import { AsyncCallback, BusinessError } from ‘@kit.BasicServicesKit’;

export function onBluetoothDeviceFound(options : OnBluetoothDeviceFoundCallback,name ?:string) { let isSuccess = true; console.log(JSON.stringify(options),name) try {

let devicesData : Array<DevicesOptions> = [];
ble.on("BLEDeviceFind", (data: Array<ble.ScanResult>)=>{
  // console.info(JSON.stringify(data))
  for(let i = 0; i < data.length; i++){
    let obj : DevicesOptions = {
      deviceId: data[i].deviceId,
      RSSI: data[i].rssi,
      name: data[i].deviceName
    }
    devicesData.push(obj)
  }
  let res : OnBluetoothDeviceFoundOptions = {
    devices: devicesData
  };

  options?.(res);
});

let scanOptions: ble.ScanOptions = {
  interval: 500,
  dutyMode: ble.ScanDuty.SCAN_MODE_LOW_LATENCY,
  matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE
}
ble.startBLEScan(name ? [{name: name}] as ble.ScanFilter[] : null,scanOptions);

} catch (err) { isSuccess = false; console.error('errCode: ’ + (err as BusinessError).code + ', errMessage: ’ + (err as BusinessError).message); } }


操作步骤:

let scanOptions: ble.ScanOptions = {
  interval: 500,
  dutyMode: ble.ScanDuty.SCAN_MODE_LOW_LATENCY,
  matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE
}

预期结果:

正常扫描APP不会崩溃


实际结果:

正常扫描APP崩溃

bug描述:

鸿蒙低功耗蓝牙搜索,会导致APP崩溃退出 设置 ScanOptions 扫描的配置参数, 低功耗模式 3分钟左右会退; 均衡模式 1分10秒左右会退; 低延迟模式 20 秒


更多关于uni-app uts调用鸿蒙低功耗蓝牙扫描APP闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app uts调用鸿蒙低功耗蓝牙扫描APP闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对您提到的uni-app在调用鸿蒙低功耗蓝牙扫描时出现APP闪退的问题,这通常涉及到跨平台兼容性和底层API调用的稳定性。以下是一个简化的代码案例,展示了如何在uni-app中尝试调用鸿蒙的低功耗蓝牙扫描功能,并包含了一些基本的错误处理机制,以预防APP闪退。需要注意的是,uni-app本身并不直接支持鸿蒙的API,因此可能需要借助一些插件或原生代码桥接。

步骤1:配置原生插件

首先,确保你已经在uni-app项目中配置了支持鸿蒙的原生插件。这通常涉及在manifest.json中添加原生模块配置,并编写相应的原生代码。

步骤2:编写原生代码(以鸿蒙为例)

在鸿蒙原生模块中,编写低功耗蓝牙扫描的代码:

// 鸿蒙原生模块代码示例
import ohos.bluetooth.le.ScanCallback;
import ohos.bluetooth.le.ScanFilter;
import ohos.bluetooth.le.ScanResult;
import ohos.bluetooth.le.ScanSettings;
import ohos.bluetooth.BluetoothAdapter;

public class BleScanner {
    public void startScan() {
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        if (adapter != null && adapter.isEnabled()) {
            ScanSettings settings = new ScanSettings.Builder().build();
            ScanFilter filter = new ScanFilter.Builder().build();
            adapter.getBluetoothLeScanner().startScan(new ScanCallback() {
                @Override
                public void onScanResult(int callbackType, ScanResult result) {
                    // 处理扫描结果
                }

                @Override
                public void onBatchScanResults(List<ScanResult> results) {
                    // 批量处理扫描结果
                }

                @Override
                public void onScanFailed(int errorCode) {
                    // 处理扫描失败
                }
            }, settings, filter);
        } else {
            // 处理蓝牙未开启或不可用的情况
        }
    }
}

步骤3:在uni-app中调用原生模块

在uni-app的JavaScript代码中,通过plus.runtime.exec或相应的插件接口调用原生模块:

// uni-app中的JavaScript代码示例
try {
    plus.runtime.exec('BleScanner', 'startScan', [], function(e) {
        console.log('扫描开始');
    }, function(e) {
        console.error('调用失败:', e.message);
    });
} catch (error) {
    console.error('捕获到异常:', error);
}

注意事项

  • 确保鸿蒙设备上已开启蓝牙权限。
  • 在原生代码中添加充分的错误处理和日志记录,以便定位问题。
  • 考虑到不同设备的兼容性,可能需要针对特定设备进行额外的适配。
  • 如果APP仍然闪退,建议使用鸿蒙的开发者工具进行调试,查看具体的崩溃日志,以便进一步分析问题。
回到顶部