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

sma*_*nja 3 iphone objective-c mpmovieplayercontroller ios avaudiosession

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

我正在使用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];
//    }
Run Code Online (Sandbox Code Playgroud)

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

sma*_*nja 5

我可以使用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];
    }
}
Run Code Online (Sandbox Code Playgroud)

播放音频

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];
}
Run Code Online (Sandbox Code Playgroud)