美文网首页
iOS监听音频线路的改变

iOS监听音频线路的改变

作者: RainKill | 来源:发表于2017-03-07 00:57 被阅读0次

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

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

    • 注册一个线路改变的通知。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监听音频线路的改变

          本文链接:https://www.haomeiwen.com/subject/xcepgttx.html