2012-05-03 101 views
1

我正在使用iPad。 我想檢測用戶何時拔出耳機。首先,我在房產kAudioSessionProperty_AudioRouteChange上使用了一位聽衆。所以一切都很好,直到我決定添加一個按鈕,以在耳機仍然插上時切換到揚聲器。所以我現在面臨一個問題,也許有人會有一個想法來解決它。音頻路由不變時的耳機插件插件事件 - iOS

下面是這種情況:

  • 我插上耳機 - >我的音樂路線更改回調叫
  • 然後切換音揚聲器(沒有拔出我的耳機) - >音頻路由改變回調叫
  • 然後我拔掉耳機(當聲音仍在輸出到揚聲器時) - >音頻路由改變回調不被調用,這似乎是合乎邏輯的。

但這是我的問題!所以我的問題是:您是否看到了一種方法來檢測該耳機是否因最後一種情況而被拔掉?

感謝您的幫助

編輯:

好,我找到了一個解決辦法:

爲了檢測耳機是否被堵塞,我執行測試功能我需要的所有次知道它(而不是使用布爾值),這可能不是很好的表現,但它的工作,這是我可能需要它的代碼:

//set back the default audio route 
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

//check if this default audio route is Heaphone or Speaker 
CFStringRef newAudioRoute; 
UInt32 newAudioRouteSize = sizeof(newAudioRoute); 
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &newAudioRouteSize, &newAudioRoute); 

NSString *newAudioRouteString = (__bridge NSString *)newAudioRoute; 

CFRelease(newAudioRoute); 

//if this default audio route is not Headphone, it means no headphone is plugged 
if ([newAudioRouteString rangeOfString:@"Headphones"].location != NSNotFound){ 
    NSLog(@"Earphone available"); 
    return true; 
} 
else { 
    NSLog(@"No Earphone available"); 
    return false; 
} 

希望它能幫助別人!

+0

你嘗試將聲音切換到耳機背部,然後嘗試拔掉耳機?我認爲,iPad會切換到揚聲器,而當您拔下耳機時,它認爲,沒有必要再次調用該功能,它已經設置在揚聲器上。 – MMMM

+0

是的,我同意你的看法,但我的需求是能夠檢測到用戶拔下了耳機,即使使用揚聲器。我需要這個來設置布爾值爲false。因爲用戶總是做他想做的事情,所以我必須處理所有情況...... – Cyril

+0

在第二種情況下,即使使用耳機切換揚聲器,您也必須能夠聽到揚聲器上的聲音以及耳機,或只在揚聲器上? – MMMM

回答

0

我想象一下如下解決方案: 您在AppDelegate中爲揚聲器創建了一個布爾值,假設: BOOL isSpeakerOn。每次調用音頻路由回調函數時,都必須驗證揚聲器的當前情況以及您想要執行的操作。

+0

我寧願需要一個布爾類似'BOOL isHeadphonePlugged'。我的問題是,如果路線沒有改變,則不會調用回調。所以我想知道是否有另一種方法來檢測事件「耳機插件」 – Cyril

相關問題