2011-04-06 16 views
1

我有一個iOS應用程序,在某些地方有一些音頻反饋,但我希望任何其他音樂用戶在後臺播放,允許玩這個。另外,我希望我的應用中的音頻能夠尊重靜音開關。根據開發者文檔,這個功能應該全部由AVAudioSession環境類別啓用。這是我正在使用的代碼:AVAudioSession類別不起作用文檔規定

if (!hasInitialisedAudioSession) { 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    [session setCategory:AVAudioSessionCategoryAmbient error:NULL]; 

    [session setActive:YES error:NULL]; 

    hasInitialisedAudioSession = YES; 
} 

該代碼執行得很好,它確實讓應用程序聽起來可以播放iPod音樂。然而,它沒有做的是尊重靜音開關。我嘗試將這些代碼替換爲類似的C音頻調用(類似AudioSessionSetProperty的東西)而不是Objective-C調用,但我得到了相同的結果 - 環境會話類別根本不想要遵守靜音開關,儘管如此文件說它應該做的。

任何想法?感謝您的幫助:)

+0

它是否同時播放和錄製?並與模擬器一起工作? – Aadil 2011-11-22 11:23:55

回答

0

我想我設法解決了這個問題 - 事實證明它與我的應用完全無關,而是iPod應用。我的應用服從靜音開關,因爲它應該在iPod沒有播放時,然後允許iPod播放它 - 我想要的所有行爲。但是,當iPod播放時,應用程序會停止響應靜音開關,所以我認爲這只是iPod對設備音頻設置的作用。如果我真的想把時間花在它上面,我可能會解決它,但只要它在iPod播放時不遵守靜音開關對我來說足夠好。

編輯:要解決此問題,只需使用此功能來確定靜音開關是否手動打開,並且如果結果爲是,則不播放您的聲音。不過,如果您沒有中央音頻管理員課程,可能會有點痛苦。如果Apple能夠在他們的文檔中發佈這種行爲,那將會很好。

- (BOOL)deviceIsSilenced 
{ 
    #if TARGET_IPHONE_SIMULATOR 
    // return NO in simulator. Code causes crashes for some reason. 
    return NO; 
    #endif 

    CFStringRef state; 
    UInt32 propertySize = sizeof(CFStringRef); 
    AudioSessionInitialize(NULL, NULL, NULL, NULL); 
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); 

    return (CFStringGetLength(state) <= 0); 
}