HarmonyOS鸿蒙Next中是否可以监听到系统亮度变化

HarmonyOS鸿蒙Next中是否可以监听到系统亮度变化 目前官网只看到有主动获取的API。

5 回复

监听可以使用settings.registerKeyObserver()

import settings from '[@ohos](/user/ohos).settings';

const context: Context =  getContext(this);
settings.registerKeyObserver(context, settings.display.SCREEN_BRIGHTNESS_STATUS, settings.domainName.DEVICE_SHARED, (err, val) => {
  if (err) {
    console.error(`Failed to get the setting. ${err.message} `);
    return;
  }
  console.log(`callback:value -> ${JSON.stringify(val)}`)
  let value:string = settings.getValueSync(context, settings.display.SCREEN_BRIGHTNESS_STATUS, '10');
  console.log(`Promise:value -> ${value}`);
});

获取与设置屏幕亮度可以通过如下两种方式:

1、通过使用settings模块实现屏幕亮度的获取与设置。

  1. 通过使用settings.getValueSync()方法可获取屏幕亮度,传入应用上下文与数据项的名称(屏幕亮度为settings.display.SCREEN_BRIGHTNESS_STATUS),以及默认值,即可获取当前屏幕亮度,获取值范围为0-255。
Button('获取屏幕亮度')
  .width(328)
  .margin({
    top: 16,
    bottom:16
  })
  .onClick(() => {
    // Get screen brightness through the getValueSync() method.
    this.settingsBrightness = settings.getValueSync(this.context, settings.display.SCREEN_BRIGHTNESS_STATUS, '10');
  })
  1. 通过使用settings.setValue()方法可设置屏幕亮度,传入应用上下文与数据项的名称(屏幕亮度为settings.display.SCREEN_BRIGHTNESS_STATUS),以及设置值,即可设置当前屏幕亮度。需要注意的是,settings.setValue()方法仅系统应用可用。

2、通过使用window模块实现屏幕亮度的获取与设置。

  1. 在EntryAbility.ets的onWindowStageCreate方法中设置一个AppStorage,保存window实例。
onWindowStageCreate(windowStage: window.WindowStage): void {
  hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  let windowClass = windowStage.getMainWindowSync();
  AppStorage.setOrCreate('windowClass',windowClass);
  // ...
}
  1. 通过window实例的getWindowProperties()获取窗口属性,其中包括屏幕亮度的信息。
​
Button('获取屏幕亮度')
  .width(328)
  .margin({
    top: 16,
    bottom:16
  })
  .onClick(() => {
    try {
      // By retrieving window properties using getWindowProperties(), the screen brightness can be obtained.
      let properties = this.windowClass?.getWindowProperties();
      this.windowBrightness = properties?.brightness ?? -1;
    } catch (exception) {
      hilog.error(0x0000, TAG,
        `Failed to obtain the window properties. Cause code: ${exception.code}, message: ${exception.message}`);
    }
  })

​
  1. 通过window实例提供的setWindowBrightness()方法,即可设置屏幕亮度。
Button('设置屏幕亮度')
  .width(328)
  .onClick(() => {
    try {
      this.windowBrightness = Math.random() * (1.0 - 0.0) + 0.0;
      if (this.windowBrightness < 0 || this.windowBrightness > 1) {
        hilog.error(0x0000, TAG, `WindowBrightness is not within the valid range`);
        return;
      }
      this.windowClass?.setWindowBrightness(this.windowBrightness, (err: BusinessError) => {
        const errCode: number = err.code;
        if (errCode) {
          hilog.error(0x0000, TAG,
            `Failed to set the brightness. Cause code: ${err.code}, message: ${err.message}`);
          return;
        }
        hilog.info(0x0000, TAG, 'Succeeded in setting the brightness.');
      });
    } catch (exception) {
      hilog.error(0x0000, TAG,
        `Failed to set the brightness. Cause code: ${exception.code}, message: ${exception.message}`);
    }
  })

说明

屏幕亮度。该参数为浮点数,可设置的亮度范围为[0.0, 1.0],其取1.0时表示最大亮度值。如果窗口没有设置亮度值,表示亮度跟随系统,此时获取到的亮度值为-1。

相关文档:

更多关于HarmonyOS鸿蒙Next中是否可以监听到系统亮度变化的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


当前HarmonyOS未提供直接监听系统亮度变化的API接口

目前没有监听系统亮度变化的API哦!

可以。在HarmonyOS Next中,可以通过@ohos.brightness模块的on('brightnessChange')方法监听系统亮度变化。该方法会返回一个BrightnessResponse对象,其中包含当前亮度值。示例代码:

import brightness from '@ohos.brightness';

brightness.on('brightnessChange', (value: brightness.BrightnessResponse) => {
  console.log(`Current brightness: ${value.brightness}`);
});

注意:需要申请ohos.permission.DISPLAY_SENSOR权限。

目前HarmonyOS Next(API 11)提供了监听系统亮度变化的完整能力。

核心API是 brightness 模块下的 on('brightnessChange') 方法。这是一个系统事件,当屏幕亮度(包括手动调整和自动亮度变化)发生改变时,会触发回调。

基本使用示例:

import { brightness } from '@kit.DeviceUsageKit';

// 监听亮度变化
brightness.on('brightnessChange', (value: number) => {
  console.info(`当前系统亮度值已变为: ${value}`);
  // 在此处执行你的业务逻辑,例如更新UI主题
});

// 在合适的时机(如页面销毁时)取消监听
// brightness.off('brightnessChange');

关键点说明:

  1. 监听对象:此API监听的是系统全局的亮度值,而非单个应用的窗口亮度。获取到的值是一个范围在 0-255 之间的整数。
  2. 自动亮度:无论用户是手动拖动亮度条,还是系统根据环境光传感器自动调整亮度,该事件都会被触发。
  3. 权限:监听亮度变化本身不需要额外声明权限。
  4. 生命周期管理:务必在组件或页面生命周期结束时(例如 aboutToDisappear 中)调用 off 方法取消监听,以防止内存泄漏和意外回调。
  5. 与主动获取API配合:你可以将此监听器与 brightness.getBrightness() 这个主动获取API结合使用。通常在监听事件触发后,如果需要更精确的控制或验证,可以再次主动获取当前值。

应用场景:

  • 阅读类应用在亮度变化时调整文字对比度或背景色。
  • 相机类应用在亮度变化时调整取景器预览参数。
  • 需要根据系统亮暗模式(通常与亮度关联)同步切换自身主题的应用。

因此,虽然你可能首先看到了主动获取的API,但 HarmonyOS Next 已经提供了标准的事件监听机制来响应系统亮度的变化。

回到顶部