iOS語音播放之切換聽筒和揚聲器的方法解決方案【轉】
阿新 • • 發佈:2019-01-23
注意事項(也就是我說的問題)
對於不希望啟動接近感測器功能的應用,如果需要進行揚聲器和聽筒進行切換過程中,則必須通過啟用接近感測器來進行聲音輸出模式的切換,在此時,必須要注意,如果當聲音通過聽筒進行播放完畢時,在播放完畢時,此時仍在聽筒模式輸出,如果此時關閉感測器功能,則導致在離開聽筒時,由於感測器功能已經關閉,應用無法再次收到註冊的感測器變更通知,而此時如果未能將底層的聲音輸出模式切換,則導致相關的聲音輸出仍從聽筒中輸出,即使引起感測器反映的障礙已經離開感測器作用範圍,但應用中獲取的感測器狀態仍未接近狀態,使根據感測器狀態進行切換聲音輸出模式操作失效。
特殊情況:
在iPhone 4s及iPhone5中,在接近感測器功能關閉後,如果此時感測器狀態為YES,則在再次啟動聲音感測器時,不會收到感測器的變更通知;
在iPhone 4中,在接近感測器功能關閉後,如果此時感測器狀態為YES,則在再次啟動聲音感測器時,會先收到一次感測器的變更通知;
此問題的解決方案:當在感測器功能開始時,如果此時感測器感測狀態為YES時,此時聲音播放結束,仍未出發感測器狀態變更時,此時不關閉感測器功能。當引起感測器反映的障礙已經離開感測器作用範圍,此時會收到感測器變更通知,在變更通知中檢測當前感測器狀態是否為開啟狀態及聲音播放狀態,如果在感測器狀態為YES時,而此時需要開啟感測器功能的操作(如聲音播放功能)已經結束時,則將感測器功能關閉即可;
-------也就是說,在不是黑屏的狀態下,關閉近感測器功能。就沒什麼問題了。
手動切換兩種模式
解決方案:新增長按手勢,切換為另一種模式。
程式碼片段:
UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)]; [longPressGestureRecognizer setMinimumPressDuration:1.0f]; [longPressGestureRecognizer setAllowableMovement:50.0]; [self.bubbleBgImageView addGestureRecognizer:longPressGestureRecognizer]; [longPressGestureRecognizer release]; --------- -(void)longPressed:(UILongPressGestureRecognizer *) gestureRecognizer { switch (gestureRecognizer.state) { case UIGestureRecognizerStateEnded: break; case UIGestureRecognizerStateCancelled: break; case UIGestureRecognizerStateFailed: break; case UIGestureRecognizerStateBegan: if ([self.voiceDelegate respondsToSelector:@selector(BaseChartVoiceLongPressed)]) { [self.voiceDelegate BaseChartVoiceLongPressed]; } break; case UIGestureRecognizerStateChanged: break; default: break; } } ------------- #pragma mark BaseChartCellDelegate -(void)BaseChartVoiceLongPressed { NSLog(@"voice long Pressed"); if ([[[AVAudioSession sharedInstance] category] isEqualToString:AVAudioSessionCategoryPlayback]) { //切換為聽筒播放 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [self showTipInfo:@"切換為聽筒模式"]; } else { //切換為揚聲器播放 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [self showTipInfo:@"切換為揚聲器模式"]; } }