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_基础
    大话数据结构笔记
    c语言深度剖析
    liunx 第一章
    zookeper实现分布式锁
    zookeeper图形化操作工具
    windows下zookeeper集群的搭建
    TransactionInterceptor]: Bean property 'transactionManagerBeanName' is not w
    深入浅出zookeeper(二)
    com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of
  • 原文地址:https://www.cnblogs.com/8335IT/p/8053864.html
Copyright © 2011-2022 走看看