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