iOS正確監(jiān)聽手機靜音鍵和側邊音量鍵的方法示例
前言
我們的App有這樣一個Feature,用戶通過音量鍵調節(jié)到最大音量時,會彈出一個Toast,提示 用戶當前音量已經最大了,繼續(xù)按音量上鍵可以設置為超大音量模式(通過調節(jié)音頻文件的音量)。剛開始,我們在App中是監(jiān)聽名稱為“AVSystemController_SystemVolumeDidChangeNotification”的系統(tǒng)通知來獲知用戶通過側邊音量鍵調節(jié)手機音量的事件。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onVolumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
處理該通知的方法如下:
- (void)onVolumeChanged:(NSNotification *)notification { if ([[notification.userInfo objectForKey:@"AVSystemController_AudioCategoryNotificationParameter"] isEqualToString:@"Audio/Video"]) { if ([[notification.userInfo objectForKey:@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"] isEqualToString:@"ExplicitVolumeChange"]) { CGFloat volume = [[notification.userInfo objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue]; if (volume != MAX_VOLUME) { // todo } else { // todo } } } }
發(fā)現(xiàn)問題
這段代碼在我們這個App中工作的一直很好。但是最近一段時間,測試人員編譯版本,有時音量調節(jié)到最大后,沒有彈出Toast提示,而有時又會彈出來。經調試,發(fā)現(xiàn)有時候能監(jiān)聽到“AVSystemController_SystemVolumeDidChangeNotification”系統(tǒng)通知,有時候又沒有,很飄忽不定。一時間大家都不知道怎么回事,很是頭疼。因為這個代碼在之前發(fā)布出去的正式版本中,從來沒有出現(xiàn)過這樣的問題。
定位問題
以前版本沒有,而現(xiàn)在的版本有,說明肯定是改出來的問題。只有checkout到之前的commit,逐一測試找出是哪次提交造成這樣的問題。但是這樣折騰了好久也沒能定位到是哪次提交造成的。最后,折騰了一天,我們這邊的一位美女同事Sharon最后解決了這個問題,她在stackoverflow上找到了類似的問題,發(fā)現(xiàn)是我們刪除之前通過耳機線控App的一個Feature時,把這段代碼刪掉了造成的。而這段代碼是開始監(jiān)聽遠程控制事件。
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
NSNotificationCenter監(jiān)聽的通知“AVSystemController_SystemVolumeDidChangeNotification”居然和RemoteControlEvents有關系,是因為耳機線上也有音量調節(jié)按鍵的原因???有知道的朋友們可以留言交流。
ios如何監(jiān)聽靜音鍵
判斷是否靜音:
- (BOOL)isMuted { CFStringRef route; UInt32 routeSize = sizeof(CFStringRef); OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &routeSize, &route); if (status == kAudioSessionNoError) { if (route == NULL || !CFStringGetLength(route)) return TRUE; } return FALSE; }
監(jiān)聽靜音鍵:
- (BOOL)addMutedListener { OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self); return s == kAudioSessionNoError; }
回調函數(shù):
void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue ) { if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return; BOOL muted = [mediaVolume isMuted]; // add code here }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
IOS中UIWebView加載Loading的實現(xiàn)方法
最近有朋友問我類似微信語音播放的喇叭動畫和界面圖片加載loading界面是怎樣實現(xiàn)的,是不是就是一個gif圖片呢!我的回答當然是否定了,當然不排除也有人用gif圖片啊!2015-05-05IOS 開發(fā)之PickerView自定義視圖的實例詳解
這篇文章主要介紹了IOS 開發(fā)之PickerView自定義視圖的實例詳解的相關資料,這里提供實例幫助大家學習理解這部分知識,需要的朋友可以參考下2017-08-08iOS實現(xiàn)文件切片儲存并且上傳(仿斷點續(xù)傳機制)
這篇文章主要給大家介紹了關于iOS實現(xiàn)文件切片儲存并上傳仿斷點續(xù)傳機制的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-12-12iOS開發(fā)中CAlayer層的屬性以及自定義層的方法
這篇文章主要介紹了iOS開發(fā)中CAlayer層的屬性以及自定義層的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11