文档管理中心

播放音量管理

本模块提供播放音量管理能力,包括对系统音量、应用音量和音频流音量的管理。

系统音量是由HarmonyOS系统全局管理的音量设置,适用于所有应用程序和设备。HarmonyOS系统将音频分为不同的流类型,每种流类型有独立的系统音量控制。

说明

系统音量可以通过物理音量按键或系统设置界面调节。在设置界面中,用户可以单独调整上述每种系统音量的大小。

常见的流类型以及对应的系统音量如下所示。

  • 媒体音量:用于音乐、视频、游戏等媒体播放。
  • 通话音量:用于语音通话。
  • 铃声音量:用于来电铃声。
  • 闹钟音量:用于闹钟提醒。

应用音量是HarmonyOS提供给三方应用用来控制该应用下所有音频流音量的一种音量类型。三方应用设置应用音量之后,该应用中起的所有音频流默认使用该音量大小。另外具有系统应用权限的应用可以通过UID单独调整指定应用的音量。

音频流音量是由应用独立控制的音量设置,仅影响该应用中指定的音频流输出音量大小。例如:媒体播放器可以独立控制其播放音量,而不影响系统音量以及该应用中的其他类型流音量。

系统音量、应用音量和音频流音量的关系如下所示。

  • 层级关系:系统音量是全局的,应用音量和音频流音量是局部的。

    应用音量和音频流音量的调整范围受系统音量的限制。例如:系统媒体音量设置为50%,应用音量设置为100%,应用程序的最终输出音量只能达到50%(50% * 100%)。

    音频流音量是对应用音量的更精细化控制。设置了应用音量的三方应用,还可以继续通过音频流音量对指定的音频流进行更加精细化的控制。

  • 协同关系:应用最终的输出音量是由系统音量、应用音量和音频流音量共同决定的。例如:系统媒体音量设置为50%,应用音量设置为50%,应用程序中对媒体音频流设置音频流音量为100%,则该音频流最终输出的音量为25%(50% * 50% * 100%)。

HarmonyOS通过系统音量,应用音量和音频流音量协同的方式实现应用对音量的精确控制。

以下各步骤示例为片段代码,可通过示例代码右下方链接获取完整示例。

系统音量

管理系统音量的接口由AudioVolumeManager提供,在使用之前,需要使用getVolumeManager获取AudioVolumeManager实例。

通过AudioVolumeManager只能获取音量信息及监听音量变化,不能主动调节系统音量。如果应用需要调节系统音量,可以使用音量面板调节系统音量。

收起
自动换行
深色代码主题
复制
  1. import { audio } from '@kit.AudioKit';
  2. // ...
  3. let audioManager = audio.getAudioManager();
  4. let audioVolumeManager = audioManager.getVolumeManager();

获取音量信息

使用AudioVolumeManager获取指定流类型的音量信息。

示例代码如下所示:

收起
自动换行
深色代码主题
复制
  1. import { audio } from '@kit.AudioKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. // ...
  4. try {
  5. // 获取指定音频流的音量。
  6. let volume = audioVolumeManager.getVolumeByStream(audio.StreamUsage.STREAM_USAGE_MUSIC);
  7. console.info(`Succeeded in getting volume by stream. Volume: ${volume}`);
  8. // ...
  9. } catch (err) {
  10. let error = err as BusinessError;
  11. console.error(`Failed to get volume by stream. Code: ${error.code}, message: ${error.message}`);
  12. // ...
  13. }
  14. // ...
  15. try {
  16. // 获取指定音频流的最小音量。
  17. let volume = audioVolumeManager.getMinVolumeByStream(audio.StreamUsage.STREAM_USAGE_MUSIC);
  18. console.info(`Succeeded in getting min volume by stream. Volume: ${volume}`);
  19. // ...
  20. } catch (err) {
  21. let error = err as BusinessError;
  22. console.error(`Failed to get min volume by stream. Code: ${error.code}, message: ${error.message}`);
  23. // ...
  24. }
  25. // ...
  26. try {
  27. // 获取指定音频流的最大音量。
  28. let volume = audioVolumeManager.getMaxVolumeByStream(audio.StreamUsage.STREAM_USAGE_MUSIC);
  29. console.info(`Succeeded in getting max volume by stream. Volume: ${volume}`);
  30. // ...
  31. } catch (err) {
  32. let error = err as BusinessError;
  33. console.error(`Failed to get max volume by stream. Code: ${error.code}, message: ${error.message}`);
  34. // ...
  35. }

监听系统音量变化

通过设置监听事件,可以监听系统音量的变化:

说明

不同输出设备的系统音量相互独立。当音频流的输出设备发生变更时,当前设备上该流类型的系统音量可能与原设备不同,应用可监听最高优先级输出设备变化,在设备变化后通过系统音量查询接口getVolumeByStream重新获取音量值,以更新应用侧维护的音量状态。

收起
自动换行
深色代码主题
复制
  1. import { audio } from '@kit.AudioKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. // ...
  4. try {
  5. audioVolumeManager.on('streamVolumeChange', audio.StreamUsage.STREAM_USAGE_MUSIC, (streamVolumeEvent: audio.StreamVolumeEvent) => {
  6. console.info(`Succeeded in using on function. StreamVolumeEvent: ${JSON.stringify(streamVolumeEvent)}`);
  7. // ...
  8. });
  9. } catch (err) {
  10. let error = err as BusinessError;
  11. console.error(`Failed to use on function. Code: ${error.code}, message: ${error.message}`);
  12. // ...
  13. }

使用音量面板调节系统音量

应用无法直接调节系统音量,可以通过系统音量面板,让用户通过界面操作来调节音量。当用户通过应用内音量面板调节音量时,系统会展示音量提示界面,显性地提示用户系统音量发生改变。

系统提供了ArkTS组件AVVolumePanel(音量面板),应用可以创建该组件,具体样例和介绍请查看参考文档:avVolumePanel。

应用音量

管理应用音量的接口由AudioVolumeManager提供,在使用之前,需要使用getVolumeManager获取AudioVolumeManager实例。

当音量模式设置为APP_INDIVIDUAL时,可通过下面示例接口设置、查询应用音量。

调节应用音量

收起
自动换行
深色代码主题
复制
  1. import { audio } from '@kit.AudioKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. // ...
  4. let audioManager = audio.getAudioManager();
  5. let audioVolumeManager = audioManager.getVolumeManager();
  6. let appVolumeChangeCallback = (volumeEvent: audio.VolumeEvent) => {
  7. console.info(`Succeeded in using on function. VolumeEvent: ${JSON.stringify(volumeEvent)}`);
  8. // ...
  9. };
  10. // ...
  11. try {
  12. // 监听应用音量变化。
  13. audioVolumeManager.on('appVolumeChange', appVolumeChangeCallback);
  14. } catch (err) {
  15. let error = err as BusinessError;
  16. console.error(`Failed to use on function. Code: ${error.code}, message: ${error.message}`);
  17. // ...
  18. }
  19. // ...
  20. // 设置应用的音量(范围为0到100)。
  21. audioVolumeManager.setAppVolumePercentage(20).then(() => {
  22. console.info('Succeeded in setting app volume percentage.');
  23. // ...
  24. }).catch((err: BusinessError) => {
  25. console.error(`Failed to set app volume percentage. Code: ${err.code}, message: ${err.message}`);
  26. // ...
  27. });
  28. // ...
  29. // 查询应用音量。
  30. audioVolumeManager.getAppVolumePercentage().then((volume: number) => {
  31. console.info(`Succeeded in getting app volume percentage. Volume: ${volume}`);
  32. // ...
  33. }).catch((err: BusinessError) => {
  34. console.error(`Failed to get app volume percentage. Code: ${err.code}, message: ${err.message}`);
  35. // ...
  36. });

音频流音量

应用可使用AVPlayer的setVolume或AudioRenderer的setVolume设置音频流音量。

使用AudioRenderer的setVolume和getVolume接口分别完成音频流音量的设置和获取。

示例代码如下所示:

收起
自动换行
深色代码主题
复制
  1. import { audio } from '@kit.AudioKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. // ...
  4. // 设置音频流音量,音量范围为[0.0-1.0]。
  5. audioRenderer.setVolume(0.1).then(() => {
  6. console.info('Succeeded in setting volume.');
  7. // ...
  8. }).catch((err: BusinessError) => {
  9. console.error(`Failed to set volume. Code: ${err.code}, message: ${err.message}`);
  10. // ...
  11. });
  12. // ...
  13. try {
  14. // 获取音频流音量。
  15. let volume: number = audioRenderer.getVolume();
  16. console.info(`Succeeded in getting volume. Volume: ${volume}`);
  17. // ...
  18. } catch (err) {
  19. let error = err as BusinessError;
  20. console.error(`Failed to get volume. Code: ${error.code}, message: ${error.message}`);
  21. // ...
  22. }