Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在应用程序中更改音频会话模式_Ios_Cocoa Touch_Avaudiosession - Fatal编程技术网

Ios 在应用程序中更改音频会话模式

Ios 在应用程序中更改音频会话模式,ios,cocoa-touch,avaudiosession,Ios,Cocoa Touch,Avaudiosession,当应用程序中需要特定行为时,是否可以更改会话类别和选项?例如设置: [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; 据苹果公司称,docs将不接受静音开关 该应用程序录制和播放音频。在播放音频时,应用程序需要遵守静音开关。问题是:我可以这样设置类别吗: [[AVAudioSession sharedInstance] setCat

当应用程序中需要特定行为时,是否可以更改会话类别和选项?例如设置:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
据苹果公司称,docs将不接受静音开关

该应用程序录制和播放音频。在播放音频时,应用程序需要遵守静音开关。问题是:我可以这样设置类别吗:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&sessionError];
播放开始时,应用程序将遵守静音开关。如果我这样做,这将如何影响路由?苹果文档声明:

会话的类别和模式共同定义了应用程序的运行方式 打算使用音频。通常,您应该设置类别和模式 在激活会话之前。您还可以设置类别或模式 虽然会话处于活动状态,但这将导致 改变路线


可以更改,引用文档:

在iOS中运行的每个应用程序都有一个单独的音频会话,而音频会话又有 单一类别。您可以在播放时更改音频会话的类别 你的应用正在运行

因此,当您希望应用程序更改模式时,只需调用
setCategory:
方法即可

例如,您启动应用程序时允许从其他应用程序播放声音:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]
    (...)
}
当用户按下UI上的播放按钮时,切换到播放模式:

- (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)并记录错误以进行调试。

讨论

会话的类别和模式共同定义了 应用程序打算使用音频。通常,您可以设置类别和 激活会话前的模式。您还可以设置类别或名称 会话处于活动状态时的模式,但这会立即导致 改变路线

听起来像是在
setActive:error:
之前调用了
setCategory:error:
和“-setMode: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.
}

嘿,克里斯,你在这方面有过好运吗?我有过,可以说,很明显,改变“在飞行中”的类别是可能的。我必须再次提取代码,以查看我们是如何实现它的,但它确实起了作用。