如何调节系统音量
========

#### 问题现象

有没有API可以调节系统媒体音量大小，[AudioManager.setVolume](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiomanager#setvolumedeprecated)接口已废弃，如何调节系统音量？

#### 背景知识

[AVVolumePanel](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avvolumepanel)提供创建音量面板AVVolumePanel的功能，提供展示和调节系统音量的统一面板。

[AudioManager.setVolume](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiomanager#setvolumedeprecated)接口已废弃，替代接口仅面向系统应用开放。

#### 解决方案

应用无法直接调节系统音量，可以通过系统音量面板[AVVolumePanel](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avvolumepanel)组件，让用户通过界面操作来调节音量。

注意事项：

*   应用如果希望自定义音量条，隐藏系统音量面板，可设置[AVVolumePanelParameter](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-multimedia-avvolumepanel#avvolumepanelparameter)的position的x或y坐标值为负数。
*   调节系统音量时请设置合理大小，否则可能设置无效，可通过[getMinVolumeByStream](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiovolumemanager#getminvolumebystream20)获取指定音频流的最小音量，通过[getMaxVolumeByStream](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiovolumemanager#getmaxvolumebystream20)获取指定音频流的最大音量，通过[getVolumeByStream](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-audiovolumemanager#getvolumebystream20)获取指定音频流的当前音量。
*   应用如果希望进入页面后，设置默认音量值，可以在进入页面，延迟一定时间（例如1秒）等待页面渲染完成后，再通过音量面板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%');
  }
}