在播放音頻時讓其餘程序靜音,或者在其餘程序的音頻之上播放音頻。bash
AVAudioSession
類由 AVFoundation
框架引入。每一個 iOS 應用都有一個音頻會話。這個會話能夠被 AVAudioSession
類的 sharedInstance
類方法訪問,以下:
session
AVAudioSession *audioSession = [AVAudioSession sharedInstance];複製代碼
在得到一個 AVAudioSession
類的實例後,你就能經過調用音頻會話對象的 setCategory:error:
實例方法,來從 iOS 應用可用的不一樣類別中做出選擇。框架
AVAudioSessionCategoryAmbient
ui
這個類別不會中止其餘應用的聲音,相反,它容許你的音頻播放於其餘應用的聲音之 上,好比 iPod。你的應用的主 UI 線程會工做正常。調用 AVAPlayer
的 prepareToPlay
和 play 方法都將返回 YES。spa
AVAudioSessionCategorySoloAmbient
這個很是像 AVAudioSessionCategoryAmbient 類別,除了會中止其餘程序的音頻回放,好比 iPod 程序。當設備被設置爲靜音模式,你的音頻回放將會中止。線程
AVAudioSessionCategoryRecord
code
這會中止其餘應用的聲音(好比 iPod)並讓你的應用也不能初始化音頻回放(好比 AVAudioPlayer
)。在這種模式下,你只能進行錄音。使用這個類別,調用 AVAudioPlayer
的 prepareToPlay
會返回 YES,可是調用 play
方法將返回 NO。主 UI 界面會照常工做。這時, 即便你的設備屏幕被用戶鎖定了,應用的錄音仍會繼續。視頻
AVAudioSessionCategoryPlayback
對象
這個類別會禁止其餘應用的音頻回放(好比 iPod 應用的音頻回放)。你可使用 AVAudioPlayer
的 prepareToPlay 和 play 方法,在你的應用中播放聲音。主 UI 界面會照常工做。這時,即便屏幕被鎖定或者設備爲靜音模式,音頻回放都會繼續。開發
AVAudioSessionCategoryPlayAndRecord
這個類別容許你的應用中同時進行聲音的播放和錄製。當你的聲音錄製或播放開始後, 其餘應用的聲音播放將會中止。主 UI 界面會照常工做。這時,即便屏幕被鎖定或者設備爲 靜音模式,音頻回放和錄製都會繼續。
AVAudioSessionCategoryAudioProcessing
這個類別用於應用中進行音頻處理的情形,而不是音頻回放或錄製。設置了這種模式, 你在應用中就不能播放和錄製任何聲音。調用 AVAPlayer
的 prepareToPlay
和 play
方法都將 返回 NO。其餘應用的音頻回放,好比 iPod,也會在此模式下中止。
解決方案:當咱們本身開發的應用播放時,暫停其餘應用的播放,當咱們的應用播放完畢時,繼續其餘應用的播放,核心代碼以下:
後臺音樂播放暫停與繼續
// 繼續播放後臺背景音樂, 取消激活當前應用的audio session
+ (void)resumeBackgroundSoundWithError:(NSError **)error {
[[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:error];
}
//暫停後臺背景音樂的播放,激活當前應用的audio
+ (void)pauseBackgroundSoundWithError:(NSError **)error {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback withOptions: AVAudioSessionCategoryOptionAllowBluetooth error:error];
[session setActive:YES error:error];
}
+ (void)pauseBackgroundSoundWithCategoryRecord {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
[session setActive:YES error:nil];
}
複製代碼
Category
的選擇,取決於在激活應用的audio session
時,下一步要錄音仍是播放,若是錄音的話,必定要設置category
爲AVAudioSessionCategoryRecord
AVAudioSessionCategoryPlayback
AVAudioSessionCategoryPlayback
,可能會獲得一個意想不到的的結果Unexpected error or warning