zoukankan      html  css  js  c++  java
  • iOS耳机监听

    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;
    }
    

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



    转发自-----作者:再见远洋,转
  • 相关阅读:
    Python中的try...except...finally
    JavaScript 实现双向队列并用此来测试一个单词是否为回文
    js 触发 change 事件
    MySQL8 重置改root密码及开放远程访问
    根据数组下标在MongoDB中修改数组元素
    pymongo CursorNotFound错误
    mongodb根据子项中的指标查找最小或最大值
    正则文本过滤时的一些注意事项
    github page更新后不生效
    Xpath同时选取不同属性的元素
  • 原文地址:https://www.cnblogs.com/8335IT/p/8053864.html
Copyright © 2011-2022 走看看