iOS监听音频线路的改变

为什么要监听音频线路的改变?,场景如下:当用户接入耳机时,声音按照耳机线路进行播放,当用户拔出耳机时,声音停止,这是一个简单的需求,苹果文档建议这样操作,因为当用户拔出耳机的时候,应断定用户不需要外放功能(因为你不再听音乐了嘛,这其实是一个用户体验的问题。
注:公交车上正听着音乐,手机被偷了咋办?我朋友就被这样丢过手机,被偷了都不知道被谁偷的。ㄟ( ▔, ▔ )ㄏ如果你不想拔出耳机的时候自动静音那就不用看下面的文章了。

如何实现耳机拔出后自动静音功能?

  • 注册一个线路改变的通知。AVAudioSessionRouteChangeNotification
  • 监听这个通知,获取前一个线路的设备。
  • 从通知处获取上一个设备的outputs属性,获取设备I/O接口,判断上一个设备的I/O接口点是不是耳机。
  • 调用delegateplaybackStopped方法停止音频输出。

代码一:

//注册线路改变的通知
        [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];
        }
    }
}

你可能感兴趣的:(iOS监听音频线路的改变)