2013-03-13 91 views
1

我需要一種在AudioSession初始化後更改或禁用AudioSessionInterruptionListener的方法。如何更改或禁用AudioSessionInterruptionListener

這是爲什麼:在某些使用情況下,我的應用程序必須在帶有音頻錄製的背景中運行,因此音頻背景模式已設置 - 這是有效的。當一個電話或其他中斷髮生時,我必須通知一些其他對象來乾淨地停止錄音 - 這是有效的。然後當應用程序完成與AudioSession我呼籲AudioSessionSetActive(false); - 這可以工作(如果應用程序發送到後臺與活動會話,我會得到頂部的紅色欄,如果會話不活動,紅色欄不會出現。儘管我猜,技術上應用程序仍處於「活動」後臺模式)。

但是!如果我已完成錄製,並且應用程序已發送到後臺並且音頻會話已停用,如果有來電,或者Siri已激活,那麼我的應用程序仍會收到AudioSessionInterruptionListener回調。是的,我可以添加代碼來測試我的應用程序當前是否應該響應中斷。但是,我認爲這是一個錯誤。如果我已經停用了AudioSession,中斷應該不會被調用,實際上所有的音頻會話/屬性監聽器都應該停止被調用。

如何更改或禁用AudioSessionInterruptionListener?或者,也許另一種方式來問這個問題,我怎樣才能防止我的應用程序在不需要它時使用背景模式?

其他信息

好吧,似乎在iOS 6中現在有NSNotifications爲AudioSession中斷:AVAudioSessionDidBeginInterruptionNotificationAVAudioSessionDidEndInterruptionNotification。不過,我支持iOS 5.1及以上版本,所以這沒有幫助。和我發現新通知的相同文檔說,Obj-C接口AVAudioSession的委託屬性已折舊(在IOS 6中),所以我可能不應該使用它來設置/更改委託(並獲取Obj -C中斷回調)。

我想一個可能的解決辦法是測試iOS版本,並在< 6.0設置和取消設置委託,然後在6.0 +聽取NSNotifications(這將不會出現在< 6.0,所以不應該'噸休息)。但是,這看起來像一團糟。

+0

這真是太痛苦了。我正在處理它,因爲我正在使用C API,所以我感到更加痛苦。 – kakyo 2013-07-02 15:01:17

回答

0

當你使用它時,你是否試過調用AudioSessionInitialize並將NULL傳遞給AudioSessionInterruptionListener(即將處理中斷的函數)?

的界面如下:

OSStatus AudioSessionInitialize (
     CFRunLoopRef      inRunLoop, 
     CFStringRef      inRunLoopMode, 
     AudioSessionInterruptionListener inInterruptionListener, 
     void        *inClientData 
); 

文檔明確地說:

你的應用程序必須進行任何其他音頻會議服務調用之前調用這個函數。您可以根據需要激活和停用音頻會話(請參閱AudioSessionSetActive),但應只初始化一次。

+0

我很積極,我嘗試調用AudioSessionInitialize一次來激活它(在填充了Listener參數的情況下),然後當我想停止監聽時,我再次用Listener參數的NULL調用它 - 它沒有執行插孔。這是令人沮喪的部分 - 我無法讓它停止調用監聽器。我仍然需要調用AVAudioSession setDelegate:nil(在6中折舊)停止中斷,並且setDelegate:self再次打開中斷。現在,我將重新訪問此代碼,現在我的最後一個測試人員正在從iOS 5遷移。 – 2013-07-17 14:34:55

+0

有趣的問題。似乎應該有一個C風格的界面函數來初始化會話和中斷監聽器。 – rmigneco 2013-07-17 19:37:14

相關問題