如何通过内置耳机扬声器播放音频

我已经看到一些像WhatsApp这样的应用程序具有仅当用户将设备靠近耳朵时才通过耳机(电话扬声器)播放音频剪辑的function。 否则它通过普通的内置扬声器播放。

我正在使用MPMoviePlayer播放音频剪辑。

我确实在互联网上经历了许多类似的问题和答案,并且所有答案都说将AudioSession类别设置为PlayAndRecord。 而已。

我做了同样的事,但无法得到我想要的确切结果。

// Audio Player self.audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [audioSession setActive:YES error:nil]; self.moviePlayer = [[MPMoviePlayerController alloc] init]; self.moviePlayer.view.hidden = YES; // AVAudioSessionPortDescription *routePort = self.audioSession.currentRoute.outputs.firstObject; // NSString *portType = routePort.portType; // // if ([portType isEqualToString:@"Receiver"]) { // [self.audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; // } else { // [self.audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil]; // } 

任何人都可以告诉我,只有当用户打开设备时,我才能通过耳机扬声器修改音源来播放音频的方式和位置?

我可以使用AVAudioSession和ProximityMonitering来做到这一点

 - (void)viewDidLoad { [super viewDidLoad]; [UIDevice currentDevice].proximityMonitoringEnabled = YES; if ([UIDevice currentDevice].proximityMonitoringEnabled == YES) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChanged:) name:@"UIDeviceProximityStateDidChangeNotification" object:[UIDevice currentDevice]]; } } - (void) proximityChanged:(NSNotification *)notification { UIDevice *device = [notification object]; NSLog(@"In proximity: %i", device.proximityState); if(device.proximityState == 0){ [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; } else{ [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil]; } } 

播放音频

 audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [audioSession setActive:YES error:nil]; AVAudioSessionPortDescription *routePort = audioSession.currentRoute.outputs.firstObject; NSString *portType = routePort.portType; NSLog(@"PortType %@", portType); if ([portType isEqualToString:@"Receiver"]) { [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; }