HarmonyOS 鸿蒙Next中订阅电池状态事件,回调函数不返回数据
HarmonyOS 鸿蒙Next中订阅电池状态事件,回调函数不返回数据
export default class BatteryMonitor {
subscriber: commonEventManager.CommonEventSubscriber | null = null;
}
// 开始监听电池状态
startMonitoring(): void {
// 订阅充电状态变化事件
commonEventManager.createSubscriber({ events: ['usual.event.BATTERY_CHANGED'] },
(err: BusinessError, data: commonEventManager.CommonEventSubscriber) => {
if (err) {
console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);
return;
}
this.subscriber = data;
console.info('Succeeded in creating subscriber.');
// 订阅公共事件回调
if (this.subscriber !== null) {
commonEventManager.subscribe(this.subscriber,
(err: BusinessError, data: commonEventManager.CommonEventData) => {
if (err) {
console.error( `Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`);
return;
}
this.checkBatteryStatus();
console.info( `Succeeded in subscribing, data is ${JSON.stringify(data)}`);
})
} else {
console.error(`Need create subscriber`);
}
})
}
// 释放资源
async release(): Promise<void> {
commonEventManager.unsubscribe(this.subscriber)
this.subscriber = null
}
}
我在订阅电池状态事件时,回调函数不返回数据,也就是data一直返回的数据都是null,导致this.checkBatteryStatus()方法一直不能执行,不知道是什么原因,调试时当onCreate方法执行完毕时,日志中会输出Succeeded in creating subscriber,其他信息不会输出,我查文档后知道,usual.event.BATTERY_CHANGED事件不需要在module.json5中申请权限,请大佬帮看看是什么问题?谢谢!
更多关于HarmonyOS 鸿蒙Next中订阅电池状态事件,回调函数不返回数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html
自己已解决!
更多关于HarmonyOS 鸿蒙Next中订阅电池状态事件,回调函数不返回数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,订阅电池状态事件时回调函数不返回数据,通常与事件注册或权限配置有关。确保已正确导入@ohos.batteryInfo模块,并使用batteryInfo.on('batteryChargeStateChange')注册事件。检查回调函数参数是否正确定义,例如(data: batteryInfo.BatteryChargeState)。确认应用已在module.json5中申请ohos.permission.POWER_MANAGER权限,并在系统设置中开启相应授权。若使用模拟器,部分硬件事件可能无法触发,需在真机测试。
在 HarmonyOS Next 中订阅电池状态事件时,回调函数不返回数据通常与事件订阅方式或系统状态有关。根据您提供的代码,可能存在以下问题:
-
事件触发条件未满足:
usual.event.BATTERY_CHANGED事件仅在电池状态实际发生变化时触发(例如充电状态、电量百分比变化)。如果设备电池状态未发生改变,回调函数可能不会返回数据。 -
订阅时机问题:确保在应用生命周期内正确调用
startMonitoring()方法,且未过早释放订阅者(例如在onDestroy中调用release()前事件未触发)。 -
回调函数参数检查:在
subscribe的回调中,建议先检查data的具体字段。电池事件数据可能通过data.parameters传递,而非直接通过data对象。可尝试以下修改:
commonEventManager.subscribe(this.subscriber, (err: BusinessError, data: commonEventManager.CommonEventData) => {
if (err) {
console.error(`Subscribe failed: ${err.message}`);
return;
}
if (data?.parameters) {
console.info(`Battery data: ${JSON.stringify(data.parameters)}`);
this.checkBatteryStatus();
} else {
console.warn("No battery data received");
}
});
- 系统权限或配置:虽然文档说明无需声明权限,但请确认设备系统版本与 API 兼容性,并检查
commonEventManager模块是否正常初始化。
建议在物理设备上测试,并通过 console.info 输出 data 的完整结构,以确认事件数据格式。若仍无数据,可尝试监听其他系统事件(如屏幕亮灭)验证事件订阅逻辑是否正确。

