標籤: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耳機監聽