我嘗試使用這些方法來嘗試檢測“振鈴/靜音”開關是否處于活動狀態:如何以編程方式感應iPhone靜音開關?AVAudioSession類別無法按文檔要求運行但是在我的iPhone 4上,“狀態”值始終為“揚聲器”(而CFStringGetLength(state)返回的長度值始終為7)。有人成功使用過此方法嗎?如果是,請問哪種設備和SDK版本?我這樣稱呼它:- (BOOL)deviceIsSilenced { CFStringRef state; UInt32 propertySize = sizeof(CFStringRef); OSStatus audioStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); if (audioStatus == kAudioSessionNoError) { NSLog(@"audio route: %@", state) // "Speaker" regardless of silent switch setting, but "Headphone" when my headphones are plugged in return (CFStringGetLength(state) <= 0); } return NO;}-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; audioSession.delegate = self; [audioSession setCategory:AVAudioSessionCategoryAmbient error:nil]; [audioSession setActive:YES error:nil]; NSLog(@"muted? %i", [self deviceIsSilenced]); ...}我當時在想,當電話上的物理開關切換時,可能會觸發其他(更準確)的kAudioSessionProperty事件。有人有想法么?順便說一句,我在我的[AVAudioSession sharedInstance]中使用了AVAudioSessionCategoryAmbient類別。
3 回答

不負相思意
TA貢獻1777條經驗 獲得超10個贊
我瀏覽了這個VSSilentSwitch庫。
對我不起作用(當您開始實際使用音頻時不起作用)。
我在考慮他是如何做到的,然后意識到,當我們沉默時,幾乎在聲音開始播放后就立即調用音頻完成呼叫。
更具體一點:
使用AudioServicesPlaySystemSound
播放的系統聲音將在開始播放后立即完成播放。
當然,這僅適用于尊重靜音開關的音頻類別(默認情況下AVAudioSessionCategoryAmbient
遵守它)。
因此,訣竅是創建系統聲音,最好是無聲聲音,并一遍又一遍地播放它,同時檢查從播放到完成所花費的時間(使用安裝安裝過程AudioServicesAddSystemSoundCompletion
)。
如果完成過程很快被調用(允許某個閾值),則表示靜音開關已打開。
此技巧有很多警告,最大的一個事實是它不能在所有音頻類別上使用。
如果您的應用程序在后臺播放音頻-請確保您在后臺播放時停止此測試,否則您的應用程序將永遠在后臺運行(并且也會被蘋果拒絕)。
- 3 回答
- 0 關注
- 674 瀏覽
添加回答
舉報
0/150
提交
取消