1# 播放音量管理 2<!--Kit: Audio Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @songshenke--> 5<!--Designer: @caixuejiang; @hao-liangfei; @zhanganxiang--> 6<!--Tester: @Filger--> 7<!--Adviser: @zengyawen--> 8 9本模块提供播放音量管理能力,包括对**系统音量**、**应用音量**和**音频流音量**的管理。 10 11**系统音量**是由OpenHarmony系统全局管理的音量设置,适用于所有应用程序和设备。OpenHarmony系统将音频分为不同的流类型,每种流类型有独立的系统音量控制。 12 13> **说明:** 14> 15> 系统音量可以通过物理音量按键或系统设置界面调节。在设置界面中,用户可以单独调整上述每种系统音量的大小。 16 17常见的流类型以及对应的系统音量如下所示。 18 19- 媒体音量:用于音乐、视频、游戏等媒体播放。 20- 通话音量:用于语音通话。 21- 铃声音量:用于来电铃声。 22- 闹钟音量:用于闹钟提醒。 23 24**应用音量**是OpenHarmony提供给三方应用用来控制该应用下所有音频流音量的一种音量类型。三方应用设置应用音量之后,该应用中起的所有音频流默认使用该音量大小。另外具有系统应用权限的应用可以通过UID单独调整指定应用的音量。 25 26**音频流音量**是由应用独立控制的音量设置,仅影响该应用中指定的音频流输出音量大小。例如:媒体播放器可以独立控制其播放音量,而不影响系统音量以及该应用中的其他类型流音量。 27 28系统音量、应用音量和音频流音量的关系如下所示。 29 30- 层级关系:系统音量是全局的,应用音量和音频流音量是局部的。 31 32 应用音量和音频流音量的调整范围受系统音量的限制。例如:系统媒体音量设置为50%,应用音量设置为100%,应用程序的最终输出音量只能达到50%。<br> 33 音频流音量是对应用音量的更精细化控制。设置了应用音量的三方应用,还可以继续通过音频流音量对指定的音频流进行更加精细化的控制。 34- 协同关系:应用最终的输出音量是由系统音量、应用音量和音频流音量共同决定的。例如:系统媒体音量设置为50%,应用音量设置为50%,应用程序中对媒体音频流设置音频流音量为100%,则该音频流最终输出的音量为25%。 35 36OpenHarmony通过系统音量,应用音量和音频流音量协同的方式实现应用对音量的精确控制。 37 38## 系统音量 39 40管理系统音量的接口由AudioVolumeManager提供,在使用之前,需要使用[getVolumeManager()](../../reference/apis-audio-kit/arkts-apis-audio-AudioManager.md#getvolumemanager9)获取AudioVolumeManager实例。 41 42通过AudioVolumeManager只能获取音量信息及监听音量变化,不能主动调节系统音量。如果应用需要调节系统音量,可以[使用音量面板调节系统音量](#使用音量面板调节系统音量)。 43 44```ts 45import { audio } from '@kit.AudioKit'; 46 47let audioManager = audio.getAudioManager(); 48let audioVolumeManager = audioManager.getVolumeManager(); 49``` 50 51### 获取音量信息 52 53管理系统音量的接口由AudioVolumeManager提供,在使用之前,需要使用[getVolumeManager()](../../reference/apis-audio-kit/arkts-apis-audio-AudioManager.md#getvolumemanager9)获取AudioVolumeManager实例。 54 55```ts 56import { audio } from '@kit.AudioKit'; 57 58let audioManager = audio.getAudioManager(); 59let audioVolumeManager = audioManager.getVolumeManager(); 60``` 61 62使用[AudioVolumeManager](../../reference/apis-audio-kit/arkts-apis-audio-AudioVolumeManager.md)获取指定流类型的音量信息。 63 64示例代码如下所示: 65 66```ts 67import { audio } from '@kit.AudioKit'; 68import { BusinessError } from '@kit.BasicServicesKit'; 69 70// 获取指定流的音量。 71audioVolumeManager.getVolumeByStream(audio.StreamUsage.STREAM_USAGE_MUSIC); 72 73// 获取指定流的最小音量。 74audioVolumeManager.getMinVolumeByStream(audio.StreamUsage.STREA_MUSAGE_MUSIC); 75 76// 获取指定流的最大音量。 77audioVolumeManager.getMaxVolumeByStream(audio.StreamUsage.STREAM_USAGE_MUSIC); 78``` 79 80### 监听系统音量变化 81 82通过设置监听事件,可以监听系统音量的变化: 83 84```ts 85import { audio } from '@kit.AudioKit'; 86 87audioVolumeManager.on('streamVolumeChange', audio.StreamUsage.STREAM_USAGE_MUSIC, (streamVolumeEvent: audio.StreamVolumeEvent) => { 88 console.info(`StreamUsagem: ${streamVolumeEvent.streamUsage} `); 89 console.info(`Volume level: ${streamVolumeEvent.volume} `); 90 console.info(`Whether to updateUI: ${streamVolumeEvent.updateUi} `); 91}); 92``` 93 94<!--Del--> 95### 调节系统音量(仅对系统应用开放) 96 97目前调节系统音量主要是靠SystemAPI,具体服务于物理音量按键和设置。通过音量按键可以调节系统音量的大小,根据按下的具体按键调用系统接口,实现系统音量的大小调节。调节的音量类型包括媒体、铃声和通知。 98<!--DelEnd--> 99 100### 使用音量面板调节系统音量 101 102应用无法直接调节系统音量,可以通过系统音量面板,让用户通过界面操作来调节音量。当用户通过应用内音量面板调节音量时,系统会展示音量提示界面,显性地提示用户系统音量发生改变。 103 104系统提供了ArkTS组件AVVolumePanel(音量面板),应用可以创建该组件,具体样例和介绍请查看[AVVolumePanel参考文档](../../reference/apis-audio-kit/ohos-multimedia-avvolumepanel.md)。 105 106## 应用音量 107 108管理应用音量的接口由AudioVolumeManager提供,在使用之前,需要使用[getVolumeManager()](../../reference/apis-audio-kit/arkts-apis-audio-AudioManager.md#getvolumemanager9)获取AudioVolumeManager实例。 109 110当[音量模式](../../reference/apis-audio-kit/arkts-apis-audio-e.md#audiovolumemode19)设置为APP_INDIVIDUAL时,可通过下面示例接口设置、查询应用音量。 111 112### 调节应用音量 113 114```ts 115import { audio } from '@kit.AudioKit'; 116 117let audioManager = audio.getAudioManager(); 118let audioVolumeManager = audioManager.getVolumeManager(); 119 120// 设置应用的音量(范围为0到100)。 121audioVolumeManager.setAppVolumePercentage(20).then(() => { 122 console.info(`set app volume success.`); 123}); 124 125// 查询应用音量。 126audioVolumeManager.getAppVolumePercentage().then((value: number) => { 127 console.info(`app volume is ${value}.`); 128}); 129 130// 监听应用音量变化,on方法和off方法传入callback参数一致,off方法取消对应on方法订阅的监听。 131let appVolumeChangeCallback = (volumeEvent: audio.VolumeEvent) => { 132 console.info(`VolumeType of stream: ${volumeEvent.volumeType} `); 133 console.info(`Volume level: ${volumeEvent.volume} `); 134 console.info(`Whether to updateUI: ${volumeEvent.updateUi} `); 135}; 136audioVolumeManager.on('appVolumeChange', appVolumeChangeCallback); 137audioVolumeManager.off('appVolumeChange', appVolumeChangeCallback); 138``` 139 140<!--Del--> 141### 根据UID调节应用音量(仅对系统应用开放) 142 143```ts 144import { audio } from '@kit.AudioKit'; 145 146let uid: number = 20010041; // 应用ID。 147let audioManager = audio.getAudioManager(); 148let audioVolumeManager = audioManager.getVolumeManager(); 149 150// 设置指定应用的音量(范围为0到100)。 151let volume: number = 20; // 要设置的音量值。 152audioVolumeManager.setAppVolumePercentageForUid(uid, volume).then(() => { 153 console.info(`set app volume success.`); 154}); 155 156// 获取指定应用的音量(范围为0到100)。 157audioVolumeManager.getAppVolumePercentageForUid(uid).then((value: number) => { 158 console.info(`app volume is ${value}.`); 159}); 160 161// 查询应用音量是否已静音。 162audioVolumeManager.isAppVolumeMutedForUid(uid, true).then((value: boolean) => { 163 console.info(`app muted state is ${value}.`); 164}); 165 166// 设置应用静音状态。 167audioVolumeManager.setAppVolumeMutedForUid(uid, true).then(() => { 168 console.info(`set app mute state success.`); 169}); 170 171// 监听应用音量变化,on方法和off方法传入callback参数一致,off方法取消对应on方法订阅的监听。 172let appVolumeChangeForUidCallback = (volumeEvent: audio.VolumeEvent) => { 173 console.info(`VolumeType of stream: ${volumeEvent.volumeType} `); 174 console.info(`Volume level: ${volumeEvent.volume} `); 175 console.info(`Whether to updateUI: ${volumeEvent.updateUi} `); 176}; 177audioVolumeManager.on('appVolumeChangeForUid', uid, appVolumeChangeForUidCallback); 178audioVolumeManager.off('appVolumeChangeForUid', appVolumeChangeForUidCallback); 179``` 180<!--DelEnd--> 181 182## 音频流音量 183 184管理音频流音量的接口是AVPlayer或AudioRenderer的setVolume()方法,使用[AVPlayer](../../reference/apis-media-kit/arkts-apis-media-f.md#mediacreateavplayer9)设置音频流音量的示例代码如下: 185 186```ts 187let volume = 1.0; // 指定的音量大小,取值范围为[0.00-1.00],1表示最大音量。 188avPlayer.setVolume(volume); 189``` 190 191使用[AudioRenderer](../../reference/apis-audio-kit/arkts-apis-audio-f.md#audiocreateaudiorenderer8)的[setVolume](../../reference/apis-audio-kit/arkts-apis-audio-AudioRenderer.md#setvolume9)和[getVolume](../../reference/apis-audio-kit/arkts-apis-audio-AudioRenderer.md#getvolume12)接口分别完成音频流音量的设置和获取。 192 193示例代码如下所示: 194 195```ts 196import { BusinessError } from '@kit.BasicServicesKit'; 197 198// 设置音频流音量。 199audioRenderer.setVolume(0.5).then(() => { // 音量范围为[0.0-1.0]。 200 console.info('Invoke setVolume succeeded.'); 201}).catch((err: BusinessError) => { 202 console.error(`Invoke setVolume failed, code is ${err.code}, message is ${err.message}`); 203}); 204 205// 获取音频流音量。 206try { 207 let value: number = audioRenderer.getVolume(); 208 console.info(`Indicate that the volume is obtained ${value}.`); 209} catch (err) { 210 let error = err as BusinessError; 211 console.error(`Failed to obtain the volume, error ${error}.`); 212} 213``` 214 215<!--Del--> 216### 监听活跃流变化(仅对系统应用开放) 217 218通过设置监听事件,可以监听活跃流的变化。 219 220```ts 221import { audio } from '@kit.AudioKit'; 222 223// 监听活跃流变化,on方法和off方法传入callback参数一致,off方法取消对应on方法订阅的监听。 224let activeVolumeTypeChangeCallback = (volumeType: audio.AudioVolumeType) => { 225 console.info(`VolumeType of stream: ${volumeType} `); 226}; 227audioVolumeManager.on('activeVolumeTypeChange', activeVolumeTypeChangeCallback); 228audioVolumeManager.off('activeVolumeTypeChange', activeVolumeTypeChangeCallback); 229 230// 取消该事件的所有监听。 231audioVolumeManager.off('activeVolumeTypeChange'); 232``` 233<!--DelEnd-->