为什么要监听音频线路的改变?,场景如下:当用户接入耳机时,声音按照耳机线路进行播放,当用户拔出耳机时,声音停止,这是一个简单的需求,苹果文档建议这样操作,因为当用户拔出耳机的时候,应断定用户不需要外放功能(因为你不再听音乐了嘛,这其实是一个用户体验的问题。
注:公交车上正听着音乐,手机被偷了咋办?我朋友就被这样丢过手机,被偷了都不知道被谁偷的。ㄟ( ▔, ▔ )ㄏ如果你不想拔出耳机的时候自动静音那就不用看下面的文章了。
如何实现耳机拔出后自动静音功能?
- 注册一个线路改变的通知。
AVAudioSessionRouteChangeNotification
- 监听这个通知,获取前一个线路的设备。
- 从通知处获取上一个设备的
outputs
属性,获取设备I/O接口,判断上一个设备的I/O接口点是不是耳机。 - 调用
delegate
的playbackStopped
方法停止音频输出。
代码一:
//注册线路改变的通知
[nsnc addObserver:self
selector:@selector(handleRouteChange:)
name:AVAudioSessionRouteChangeNotification
object:[AVAudioSession sharedInstance]];
代码二:
- (void)handleRouteChange:(NSNotification *)notification {
NSDictionary *info = notification.userInfo;
AVAudioSessionRouteChangeReason reason = [info[AVAudioSessionRouteChangeReasonKey] intValue];
if (reason == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
//获取前一个线路的设备
AVAudioSessionRouteDescription *previousRoute = info[AVAudioSessionRouteChangePreviousRouteKey];
//获取线路的音频接口类型
AVAudioSessionPortDescription *previousOutput = previousRoute.outputs[0];
//获取音频接口类型
NSString *portType = previousOutput.portType;
//如果是耳机接口
if ([portType isEqualToString:AVAudioSessionPortHeadphones]) {
//停止播放
[self.delegate playbackStopped];
}
}
}