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
关帖;找到问题了,我之前使用的是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低功耗蓝牙操作,主要涉及以下几个步骤:
-
创建PA:在Java中创建一个PA(Particle Ability),用于处理BLE相关的操作。PA需要继承
Ability
类,并实现BLE扫描、连接、数据传输等功能。 -
定义接口:在PA中定义接口,供JS调用。使用
@JSMethod
注解标记这些方法,使其可以被JS调用。 -
JS调用PA:在JS中,使用
FeatureAbility.callAbility
方法调用PA中定义的方法。传递必要的参数,如设备地址、服务UUID、特征值等。 -
BLE操作:在PA中实现BLE的扫描、连接、读写等操作。使用
BluetoothGatt
类进行设备连接,BluetoothGattService
和BluetoothGattCharacteristic
进行服务和特征值的操作。 -
返回结果: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.callAbility
或FeatureAbility.startAbility
调用PA的ServiceAbility,传递参数并获取结果。具体步骤包括:
- 在PA中定义BLE操作接口;
- 在FA中调用PA接口,传递BLE设备地址、操作指令等;
- PA执行BLE操作并返回结果给FA。