在iOS7和更高版本的接收器和扬声器之间切换audio输出?

我有一个audio播放器,当接近传感器通知1时,可以select将audio输出从扬声器切换到接收器/听筒(不pipe耳机是否连接)。以下是我的代码。

- (void) switchAudioOutput:(NSString*)output{ AVAudioSession* audioSession = [AVAudioSession sharedInstance]; BOOL success; NSError* error; if([output isEqualToString:keAudioOutputReciever]){ //Force current audio out through reciever //set the audioSession override success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error]; if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); //activate the audio session success = [audioSession setActive:YES error:&error]; if (!success) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); }else if([output isEqualToString:keAudioOutputSpeaker]){ //set the audioSession override success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); //activate the audio session success = [audioSession setActive:YES error:&error]; if (!success) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideSpeaker"); } } 

这是基于答案切换button路由audio扬声器和接收器,并input链接说明在这里 。 我注意到,这只会强制单独的audio到扬声器,但不能确保路由单独到达接收器。 此外,转移到扬声器时,我得到以下错误:

AVAudioSession错误overrideOutputAudioPort:错误域= NSOSStatusErrorDomain代码= -50“该操作无法完成。(OSStatus错误-50。)”

我想通过避免Receiver的覆盖来解决这个问题

 - (void) setAudioSession:(NSString*)audioOutput{ NSError* error; if([audioOutput isEqualToString:audioOutputSpeaker.lowercaseString]){ //set the audioSession override if(![self setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionAllowBluetooth error:&error]) NSLog(@"AVAudioSession error AVAudioSessionCategoryPlayAndRecord:%@",error); //activate the audio session if (![self setActive:YES error:&error]) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); }else if ([audioOutput isEqualToString:audioOutputReciever.lowercaseString]){ //Force current audio out through reciever //set the audioSession override if(![self setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]) NSLog(@"AVAudioSession error AVAudioSessionCategoryPlayAndRecord:%@",error); if (![self overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error]) NSLog(@"AVAudioSession error overrideOutputAudioPort to Reciever:%@",error); //activate the audio session if (![self setActive:YES error:&error]) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); } }