在应用中需要特定行为时,是否可以更改会话类别和选项?例如设置:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
根据苹果文档不会尊重无声开关。
该应用程序记录并播放音频。在音频播放时,应用程序需要遵守静音开关。问题是:我可以像这样设置类别:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&sessionError];
播放开始时应用程序遵循静音开关。如果我这样做,这将如何影响路由? Apple Docs声明:
会话的类别和模式共同定义了应用程序的方式 打算使用音频。通常,您应该设置类别和模式 在激活会话之前。您也可以设置类别或模式 会话处于活动状态,但这会立即产生 路线变化。
答案 0 :(得分:6)
可以更改,引用文档:
在iOS中运行的每个应用都有一个音频会话,而后者又有一个 单一类别。您可以在此时更改音频会话的类别 你的应用正在运行。
因此,当您希望应用更改模式时,只需调用setCategory:
方法即可。
例如,您启动应用程序,同时允许声音从其他应用程序播放:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]
(...)
}
当用户按下用户界面上的播放按钮时,请切换到播放模式:
- (void)playAudio {
if ([AVAudioSession sharedInstance].otherAudioPlaying) {
// you can check and play only if there is no other audio playing
// maybe use another category, or enable mixing or duck option
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:nil];
} else {
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
}
[[AVAudioSession sharedInstance] setActive:YES error:nil];
}
如果您想在播放后恢复其他应用音频,您可以发出通知,或者只是关闭会话以让其他应用音频继续停止:
- (void)stopAudio {
if (self.otherAudioShouldResume) {
[[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
} else {
[[AVAudioSession sharedInstance] setActive:NO error:nil];
}
此代码仅供参考,您可能需要执行更多功能才能实现工作示例,还要记得检查这些函数的返回(BOOL)并记录错误以进行调试。
答案 1 :(得分:0)
Based on the Apple document, about AVAudioSession -setMode:error:
<强>讨论强>
会话的类别和模式一起定义了如何 应用程序打算使用音频。通常,您设置类别和 激活会话之前的模式。您也可以设置类别或 会话处于活动状态时模式,但这会导致立即生效 路线变化。
听起来setCategory:error:
和'-setMode:error:'通常在setActive:error:
之前调用。但是,如果在会话处于活动状态时调用这些方法,则音频路由将立即更改。
就我而言,
- (void)playAudio
{
/// call `-setMode:error:` for playing audio
}
- (void)stopAudio
{
/// call `-setMode:error:` back to original configuration, or set to another mode. It will result in route change immediately.
}