iOS監(jiān)聽耳機(jī)狀態(tài)

最近在做音視頻相關(guān)的開發(fā),遇到的幾個(gè)問題如下:
1 .插入耳機(jī)的時(shí)候并沒有切換到耳機(jī)播放 仍然是揚(yáng)聲器播放
2 .當(dāng)一開始手機(jī)上已經(jīng)插入耳機(jī)時(shí) ,這時(shí)候開啟音頻播放時(shí) 仍然是揚(yáng)聲器播放
因此今天主要談的就是從這兩個(gè)問題:

先來解決第一個(gè)問題:其實(shí)解決耳機(jī)插入時(shí)揚(yáng)聲器播放很明顯我們需要獲取耳機(jī)插入的這個(gè)狀態(tài),通過什么來獲取呢?通知,沒錯(cuò) 就是通過通知的方式來獲取,代碼如下有需要的自取:

 //耳機(jī)狀態(tài)獲取的通知
 [[NSNotificationCenter defaultCenter]
          addObserver:self
             selector:@selector(audioRouteChangeListenerCallback:)
                 name:AVAudioSessionRouteChangeNotification
               object:[AVAudioSession sharedInstance]];

/**
 *  監(jiān)聽耳機(jī)插入拔出狀態(tài)的改變
 *  @param notification 通知
 */
- (void)audioRouteChangeListenerCallback:(NSNotification *)notification {
      NSDictionary *interuptionDict = notification.userInfo;
      NSInteger routeChangeReason   = [[interuptionDict
          valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
      switch (routeChangeReason) {
            case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
                  DLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable");
                  //插入耳機(jī)時(shí)關(guān)閉揚(yáng)聲器播放
                  [self.agoraKit setEnableSpeakerphone:NO];
                  break;
            case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
                  DLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
                  //拔出耳機(jī)時(shí)的處理為開啟揚(yáng)聲器播放
                  [self.agoraKit setEnableSpeakerphone:YES];
                  break;
            case AVAudioSessionRouteChangeReasonCategoryChange:
                  // called at start - also when other audio wants to play
                  NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
                  break;
      }
}

第二個(gè)問題的解決:很明顯再開啟音視頻之前,我們需要判斷是否手機(jī)上已經(jīng)插入了耳機(jī)或者其他設(shè)備(這里單純說耳機(jī)),方法如下:

/**
 *  判斷是否有耳機(jī)
 *
 *  @return 判斷是否有耳機(jī)
 */
- (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;
}

我們通過這個(gè)方法來進(jìn)行判斷,如果開啟音視頻之前判斷有耳機(jī)設(shè)備,那么直接關(guān)閉揚(yáng)聲器播放,否則開啟,這樣就解決了我前面所說的兩個(gè)問題,希望可以幫到有需要的人,今天就說這么多吧,最近實(shí)在太忙了,過一陣子估計(jì)要做直播開發(fā)了,到時(shí)候分享一點(diǎn)直播開發(fā)的經(jīng)驗(yàn),敬請期待

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容