HarmonyOS鸿蒙Next中JS(FA)调用JAVA(PA)进行ble低功耗蓝牙操作

HarmonyOS鸿蒙Next中JS(FA)调用JAVA(PA)进行ble低功耗蓝牙操作 问题: 调用 scan 方法时,执行后,无返回值,也未进入回调。

流程描述: 采用订阅模式实现 JS 页面调用 PA 中检索低功耗蓝牙的功能。 调试设备:华为 watch3 手表 JS 代码如下:

// 查找蓝牙BLE
subScanDevice: async function () {
    try {
        var actionData = {};
        var action = this.initAction(1005, actionData);
        var that = this;
        var result = await FeatureAbility.subscribeAbilityEvent(action, function (callbackData) {
            console.info('eventData is: ' + callbackData);
        });
        console.info(" subscribeCommonEvent result = " + result);
    } catch (pluginError) {
        console.error("subscribeCommonEvent error : result= " + result + JSON.stringify(pluginError));
    }
},

JAVA 代码如下:

public void scanDevice(MessageParcel data, String bleCode) {
    System.out.println("开始调用扫描蓝牙接口");
    IRemoteObject notifier = data.readRemoteObject();
    MessageParcel notifyData = MessageParcel.obtain();
    BleScanCallback bleScanCallback = new BleScanCallback() {
        @Override
        public void onScanStarted(boolean b) {
            System.out.println("开始扫描");
        }

        @Override
        public void onScanning(BleDevice bleDevice) {
            String name = bleDevice.getDevice().getDeviceName().get();
            System.out.println("扫描到的设备名称:" + name);
            notifyData.writeString("\"" + name + "\"");
            try {
                notifier.sendRequest(200, notifyData, MessageParcel.obtain(), new MessageOption());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onScanFinished() {
            System.out.println("扫描结束");
        }
    };
    mBleManager.scan(bleScanCallback);
}

打印:

I System/.out: 开始调用扫描蓝牙接口
I 03B00/JSApp: app Log:  subscribeCommonEvent result = null
E LOGLIMIT/: process com.eaglenos.cgmwatch drop 730 lines, threshold:13050
E 03900/Ace: [<private>     (<private>)] fail to update all due to component is null
I 03900/Ace: [<private>(<private>)] FlutterRenderText ClearRenderObject

注:扫描这里换成定时器定时给 js 推送是没问题的,就这里调用蓝牙扫描方法他不扫描


更多关于HarmonyOS鸿蒙Next中JS(FA)调用JAVA(PA)进行ble低功耗蓝牙操作的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

关帖;找到问题了,我之前使用的是fastble组件进行蓝牙相关操作;现在改为使用官方文档的蓝牙是没问题的(注:我创建纯java项目使用fastble是正常的;创建js项目和java通信时才有问题。应该是fastble组件把扫描和结果回调封装到一起导致了js以监听方式调用java的扫描失败;而系统的扫描和回调是分开的,回调需要单独去监听,这种方式是没问题的)

更多关于HarmonyOS鸿蒙Next中JS(FA)调用JAVA(PA)进行ble低功耗蓝牙操作的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢您的反馈,如后期有疑问可以随时发帖,感谢您的支持。

在HarmonyOS鸿蒙Next中,JS(FA)调用JAVA(PA)进行BLE低功耗蓝牙操作,主要涉及以下几个步骤:

  1. 创建PA:在Java中创建一个PA(Particle Ability),用于处理BLE相关的操作。PA需要继承Ability类,并实现BLE扫描、连接、数据传输等功能。

  2. 定义接口:在PA中定义接口,供JS调用。使用@JSMethod注解标记这些方法,使其可以被JS调用。

  3. JS调用PA:在JS中,使用FeatureAbility.callAbility方法调用PA中定义的方法。传递必要的参数,如设备地址、服务UUID、特征值等。

  4. BLE操作:在PA中实现BLE的扫描、连接、读写等操作。使用BluetoothGatt类进行设备连接,BluetoothGattServiceBluetoothGattCharacteristic进行服务和特征值的操作。

  5. 返回结果:PA将BLE操作的结果通过AbilityResult返回给JS。JS接收到结果后进行处理,如更新UI或进行下一步操作。

示例代码片段:

// PA中定义BLE操作方法
public class BleAbility extends Ability {
    @JSMethod
    public void connectToDevice(String deviceAddress) {
        // BLE连接逻辑
    }
}
// JS中调用PA方法
FeatureAbility.callAbility({
    bundleName: 'com.example.ble',
    abilityName: 'BleAbility',
    method: 'connectToDevice',
    data: {
        deviceAddress: 'XX:XX:XX:XX:XX:XX'
    }
});

通过以上步骤,JS可以调用PA进行BLE低功耗蓝牙操作。

在HarmonyOS鸿蒙Next中,JS(FA)调用JAVA(PA)进行BLE低功耗蓝牙操作,主要通过Ability和ServiceAbility实现。首先,在PA中创建ServiceAbility,实现BLE操作逻辑。然后,在FA中通过FeatureAbility.callAbilityFeatureAbility.startAbility调用PA的ServiceAbility,传递参数并获取结果。具体步骤包括:

  1. 在PA中定义BLE操作接口;
  2. 在FA中调用PA接口,传递BLE设备地址、操作指令等;
  3. PA执行BLE操作并返回结果给FA。
回到顶部