目录

如何调节系统音量

问题现象

有没有API可以调节系统媒体音量大小,AudioManager.setVolume接口已废弃,如何调节系统音量?

背景知识

AVVolumePanel提供创建音量面板AVVolumePanel的功能,提供展示和调节系统音量的统一面板。

AudioManager.setVolume接口已废弃,替代接口仅面向系统应用开放。

解决方案

应用无法直接调节系统音量,可以通过系统音量面板AVVolumePanel组件,让用户通过界面操作来调节音量。

注意事项:

使用示例代码如下:

import { audio, AVVolumePanel } from '@kit.AudioKit';

let audioManager = audio.getAudioManager();
let audioVolumeManager = audioManager.getVolumeManager();
let streamUsage = audio.StreamUsage.STREAM_USAGE_MUSIC;

@Entry
@Component
export struct AVVolumePanelDemo {
  @State volume: number = audioVolumeManager.getVolumeByStream(streamUsage); // 获取当前音量值
  volumeMin: number = audioVolumeManager.getMinVolumeByStream(streamUsage); // 获取最小音量值
  volumeMax: number = audioVolumeManager.getMaxVolumeByStream(streamUsage); // 获取最大音量值
  @State positionX: number = 1100;

  aboutToAppear(): void {
    // 监听音量变化
    audioVolumeManager.on('streamVolumeChange', streamUsage, (streamVolumeEvent: audio.StreamVolumeEvent) => {
      this.volume = streamVolumeEvent.volume;
    });
  }

  onDidBuild() {
    // 进入页面渲染延迟1秒设置默认音量值
    setTimeout(() => {
      this.volume = 6;
    }, 1000);
  }

  build() {
    Column({ space: 20 }) {
      Row() {
        Text('显示音量调节面板面板:');
        Toggle({ type: ToggleType.Switch, isOn: true })
          .onChange((isOn: boolean) => {
            this.positionX = isOn ? 1100 : -1; // 坐标值,正值显示在屏幕内,负值显示在屏幕外
          });
      };

      Row({ space: 20 }) {
        Button('-')
          .onClick(() => {
            if (this.volume > this.volumeMin) {
              this.volume--;
            }
          });
        Button('+')
          .onClick(() => {
            if (this.volume < this.volumeMax) {
              this.volume++;
            }
          });
      }.width('100%');

      Text(`当前音量值:${this.volume}`);

      AVVolumePanel({
        volumeLevel: this.volume,
        volumeParameter: {
          position: {
            x: this.positionX,
            y: 200
          }
        }
      })
        .height(1);
    }
    .padding(20)
    .alignItems(HorizontalAlign.Start)
    .justifyContent(FlexAlign.Start)
    .width('100%')
    .height('100%');
  }
}

常见FAQ

Q:三方应用能否在后台控制系统音量?

A:安全规格不允许三方应用在后台控制系统音量,应用需在前台通过AVVolumePanel组件让用户通过界面操作调节音量。