1# 使用AudioSession管理应用音频焦点(ArkTS) 2 3对于涉及多个音频流并发播放的场景,系统已预设了默认的[音频焦点策略](audio-playback-concurrency.md#音频焦点策略),该策略将对所有音频流(包括播放和录制)实施统一的焦点管理。 4 5应用可利用音频会话管理(AudioSessionManager)提供的接口,通过AudioSession主动管理应用内音频流的焦点,自定义本应用音频流的焦点策略,调整本应用音频流释放音频焦点的时机,从而贴合应用特定的使用需求。 6 7本文档主要介绍AudioSession相关ArkTS API的使用方法和注意事项,更多音频焦点及音频会话的信息,可参考:[音频焦点和音频会话介绍](audio-playback-concurrency.md)。 8 9## 获取音频会话管理器 10 11创建AudioSessionManager实例。在使用AudioSessionManager的API前,需要先通过[getSessionManager](../../reference/apis-audio-kit/js-apis-audio.md#getsessionmanager12)创建实例。 12 13 ```ts 14 import { audio } from '@kit.AudioKit'; 15 16 let audioSessionManager: audio.AudioSessionManager = audioManager.getSessionManager(); 17 ``` 18 19## 激活音频会话 20 21应用可以通过[AudioSessionManager.activateAudioSession](../../reference/apis-audio-kit/js-apis-audio.md#activateaudiosession12)接口激活当前应用的音频会话。 22 23应用在激活AudioSession时,需指定[音频会话策略(AudioSessionStrategy)](audio-playback-concurrency.md#音频会话策略audiosessionstrategy)。策略中包含参数concurrencyMode,其类型为[AudioConcurrencyMode](../../reference/apis-audio-kit/js-apis-audio.md#audioconcurrencymode12),用于声明音频并发策略。 24 25 ```ts 26 import { audio } from '@kit.AudioKit'; 27 import { BusinessError } from '@kit.BasicServicesKit'; 28 29 let strategy: audio.AudioSessionStrategy = { 30 concurrencyMode: audio.AudioConcurrencyMode.CONCURRENCY_MIX_WITH_OTHERS 31 }; 32 33 audioSessionManager.activateAudioSession(strategy).then(() => { 34 console.info('activateAudioSession SUCCESS'); 35 }).catch((err: BusinessError) => { 36 console.error(`ERROR: ${err}`); 37 }); 38 ``` 39 40## 查询音频会话是否已激活 41 42应用可以通过[isAudioSessionActivated](../../reference/apis-audio-kit/js-apis-audio.md#isaudiosessionactivated12)接口检查当前应用的音频会话是否已激活。 43 44 ```ts 45 let isActivated = audioSessionManager.isAudioSessionActivated(); 46 ``` 47 48## 停用音频会话 49 50应用可以通过[deactivateAudioSession](../../reference/apis-audio-kit/js-apis-audio.md#deactivateaudiosession12)接口停用当前应用的音频会话。 51 52 ```ts 53 import { BusinessError } from '@kit.BasicServicesKit'; 54 55 audioSessionManager.deactivateAudioSession().then(() => { 56 console.info('deactivateAudioSession SUCCESS'); 57 }).catch((err: BusinessError) => { 58 console.error(`ERROR: ${err}`); 59 }); 60 ``` 61 62## 监听音频会话停用事件 63 64应用可以通过[on('audioSessionDeactivated')](../../reference/apis-audio-kit/js-apis-audio.md#onaudiosessiondeactivated12)接口监听[音频会话停用事件(AudioSessionDeactivatedEvent)](../../reference/apis-audio-kit/js-apis-audio.md#audiosessiondeactivatedevent12)。 65 66当AudioSession被停用(非主动停用)时,应用会收到[音频会话停用事件(AudioSessionDeactivatedEvent)](../../reference/apis-audio-kit/js-apis-audio.md#audiosessiondeactivatedevent12),其中包含[音频会话停用原因(AudioSessionDeactivatedReason)](../../reference/apis-audio-kit/js-apis-audio.md#audiosessiondeactivatedreason12)。 67 68在收到AudioSessionDeactivatedEvent时,应用可根据自身业务需求,做相应的处理,例如释放相应资源、重新激活AudioSession等。 69 70 ```ts 71 import { audio } from '@kit.AudioKit'; 72 73 audioSessionManager.on('audioSessionDeactivated', (audioSessionDeactivatedEvent: audio.AudioSessionDeactivatedEvent) => { 74 console.info(`reason of audioSessionDeactivated: ${audioSessionDeactivatedEvent.reason} `); 75 }); 76 ``` 77 78## 取消监听音频会话停用事件 79 80应用可以通过[off('audioSessionDeactivated')](../../reference/apis-audio-kit/js-apis-audio.md#offaudiosessiondeactivated12)接口取消监听音频会话停用事件。 81 82 ```ts 83 audioSessionManager.off('audioSessionDeactivated'); 84 ``` 85 86## 完整示例 87 88参考以下示例,完成音频会话从创建到激活并监听的过程。 89 90 ```ts 91 import { audio } from '@kit.AudioKit'; 92 import { BusinessError } from '@kit.BasicServicesKit'; 93 94 let audioManager = audio.getAudioManager(); 95 // 创建音频会话管理器 96 let audioSessionManager: audio.AudioSessionManager = audioManager.getSessionManager(); 97 // 设置音频并发模式 98 let strategy: audio.AudioSessionStrategy = { 99 concurrencyMode: audio.AudioConcurrencyMode.CONCURRENCY_MIX_WITH_OTHERS 100 }; 101 102 // 激活音频会话 103 audioSessionManager.activateAudioSession(strategy).then(() => { 104 console.info('activateAudioSession SUCCESS'); 105 }).catch((err: BusinessError) => { 106 console.error(`ERROR: ${err}`); 107 }); 108 109 // 查询音频会话是否已激活。 110 let isActivated = audioSessionManager.isAudioSessionActivated(); 111 112 // 监听音频会话停用事件 113 audioSessionManager.on('audioSessionDeactivated', (audioSessionDeactivatedEvent: audio.AudioSessionDeactivatedEvent) => { 114 console.info(`reason of audioSessionDeactivated: ${audioSessionDeactivatedEvent.reason} `); 115 }); 116 117 // 音频会话激活后,应用在此处正常执行音频播放、暂停、停止、释放等操作即可。 118 119 // 停用音频会话 120 audioSessionManager.deactivateAudioSession().then(() => { 121 console.info('deactivateAudioSession SUCCESS'); 122 }).catch((err: BusinessError) => { 123 console.error(`ERROR: ${err}`); 124 }); 125 126 // 取消监听音频会话停用事件 127 audioSessionManager.off('audioSessionDeactivated'); 128 ``` 129