1. 程式人生 > >iOS語音播放之切換聽筒和揚聲器的方法解決方案【轉】

iOS語音播放之切換聽筒和揚聲器的方法解決方案【轉】

注意事項(也就是我說的問題)     對於不希望啟動接近感測器功能的應用,如果需要進行揚聲器和聽筒進行切換過程中,則必須通過啟用接近感測器來進行聲音輸出模式的切換,在此時,必須要注意,如果當聲音通過聽筒進行播放完畢時,在播放完畢時,此時仍在聽筒模式輸出,如果此時關閉感測器功能,則導致在離開聽筒時,由於感測器功能已經關閉,應用無法再次收到註冊的感測器變更通知,而此時如果未能將底層的聲音輸出模式切換,則導致相關的聲音輸出仍從聽筒中輸出,即使引起感測器反映的障礙已經離開感測器作用範圍,但應用中獲取的感測器狀態仍未接近狀態,使根據感測器狀態進行切換聲音輸出模式操作失效。      特殊情況: 在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:@"切換為揚聲器模式"];
    }
}