本文的技術(shù)目的為檢測蘋果手機(jī)的物理靜音按鍵的開關(guān)狀態(tài),但其實真正的需求遠(yuǎn)沒有這么復(fù)雜猎醇,cry...后面和大家分享若债。
先說下技術(shù)原理吧,為大家分享一個git:git地址
原理就是播放一段0.01秒左右的無聲音頻减江,用SystemSound的方式播放,這個是播放系統(tǒng)音效捻爷,所以是受靜音按鍵控制的辈灼,播放的同時啟動一個timer,每0.001秒對一個全局變量加1役衡,在播放完成的回調(diào)里觀察這個全局變量茵休,如果是靜音模式的話播放后會立馬調(diào)用播放完成回調(diào),不會走進(jìn)timer的事件手蝎。大致就是這種方法進(jìn)行靜音開關(guān)的檢測榕莺。具體代碼就去訪問github吧。
分享下遇到的問題棵介,因為是在子線程里進(jìn)行檢測钉鸯,所以在實際調(diào)試的時候發(fā)現(xiàn)并沒有執(zhí)行timer事件,原因是當(dāng)前的線程沒有runloop邮辽,所以無法將timer事件加到runloop中去唠雕,只要執(zhí)行下[[NSRunLoop currentRunLoop]run] 就可以了。
回頭說下需求哈吨述,其實就是應(yīng)用需要在用戶調(diào)到靜音模式的時候應(yīng)用內(nèi)的聲音不播放岩睁,其實只要設(shè)置下category就可以了,真是夠笨..
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient error:&sessionError];
[[AVAudioSession sharedInstance] setActive:YES error:&sessionError];
這樣的話你的應(yīng)用的聲音就受到靜音鍵控制啦揣云。下面總結(jié)下各個category的意義:
會話類型 ? ? ?說明 ? ? 是否要求輸入 ? ?是否要求輸出 ? ? 是否遵從靜音鍵
AVAudioSessionCategoryAmbient 混音播放捕儒,可以與其他音頻應(yīng)用同時播放 否 是 是
AVAudioSessionCategorySoloAmbient 獨占播放 否 是 是
AVAudioSessionCategoryPlayback 后臺播放,也是獨占的 否 是 否
AVAudioSessionCategoryRecord 錄音模式邓夕,用于錄音時使用 是 否 否
AVAudioSessionCategoryPlayAndRecord 播放和錄音刘莹,此時可以錄音也可以播放 是 是 否
AVAudioSessionCategoryAudioProcessing 硬件解碼音頻,此時不能播放和錄制 否 否 否
AVAudioSessionCategoryMultiRoute 多種輸入輸出焚刚,例如可以耳機(jī)点弯、USB設(shè)備同時播放 是 是 否