码迷,mamicode.com
首页 > 移动开发 > 详细

iOS耳机监听

时间:2017-12-18 01:26:15      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:key   listen   其他   ati   current   切换   ack   wan   fine   

1 .插入耳机的时候并没有切换到耳机播放 仍然是扬声器播放 2 .当一开始手机上已经插入耳机时 ,这时候开启音频播放时 仍然是扬声器播放 因此今天主要谈的就是从这两个问题:

先来解决第一个问题:其实解决耳机插入时扬声器播放很明显我们需要获取耳机插入的这个状态,通过什么来获取呢?通知,没错 就是通过通知的方式来获取,代码如下有需要的自取:

 //耳机状态获取的通知
 [[NSNotificationCenter defaultCenter]
          addObserver:self
             selector:@selector(audioRouteChangeListenerCallback:)
                 name:AVAudioSessionRouteChangeNotification
               object:[AVAudioSession sharedInstance]];

/**
 *  监听耳机插入拔出状态的改变
 *  @param notification 通知
 */
- (void)audioRouteChangeListenerCallback:(NSNotification *)notification {
      NSDictionary *interuptionDict = notification.userInfo;
      NSInteger routeChangeReason   = [[interuptionDict
          valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
      switch (routeChangeReason) {
            case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
                  DLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable");
                  //插入耳机时关闭扬声器播放
                  [self.agoraKit setEnableSpeakerphone:NO];
                  break;
            case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
                  DLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
                  //拔出耳机时的处理为开启扬声器播放
                  [self.agoraKit setEnableSpeakerphone:YES];
                  break;
            case AVAudioSessionRouteChangeReasonCategoryChange:
                  // called at start - also when other audio wants to play
                  NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
                  break;
      }
}

第二个问题的解决:很明显再开启音视频之前,我们需要判断是否手机上已经插入了耳机或者其他设备(这里单纯说耳机),方法如下:

/**
 *  判断是否有耳机
 *
 *  @return 判断是否有耳机
 */
- (BOOL)hasHeadset {
      AVAudioSession *audioSession = [AVAudioSession sharedInstance];

      AVAudioSessionRouteDescription *currentRoute = [audioSession currentRoute];

      for (AVAudioSessionPortDescription *output in currentRoute.outputs) {
            if ([[output portType] isEqualToString:AVAudioSessionPortHeadphones]) {
                  return YES;
            }
      }
      return NO;
}

我们通过这个方法来进行判断,如果开启音视频之前判断有耳机设备,那么直接关闭扬声器播放,否则开启,这样就解决了我前面所说的两个问题



作者:再见远洋,转

iOS耳机监听

标签:key   listen   其他   ati   current   切换   ack   wan   fine   

原文地址:http://www.cnblogs.com/8335IT/p/8053864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!