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

3 回复

自己已解决!

更多关于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 中订阅电池状态事件时,回调函数不返回数据通常与事件订阅方式或系统状态有关。根据您提供的代码,可能存在以下问题:

  1. 事件触发条件未满足usual.event.BATTERY_CHANGED 事件仅在电池状态实际发生变化时触发(例如充电状态、电量百分比变化)。如果设备电池状态未发生改变,回调函数可能不会返回数据。

  2. 订阅时机问题:确保在应用生命周期内正确调用 startMonitoring() 方法,且未过早释放订阅者(例如在 onDestroy 中调用 release() 前事件未触发)。

  3. 回调函数参数检查:在 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");
  }
});
  1. 系统权限或配置:虽然文档说明无需声明权限,但请确认设备系统版本与 API 兼容性,并检查 commonEventManager 模块是否正常初始化。

建议在物理设备上测试,并通过 console.info 输出 data 的完整结构,以确认事件数据格式。若仍无数据,可尝试监听其他系统事件(如屏幕亮灭)验证事件订阅逻辑是否正确。

回到顶部