iOS正確監(jiān)聽(tīng)手機(jī)靜音鍵和側(cè)邊音量鍵的方法示例
前言
我們的App有這樣一個(gè)Feature,用戶(hù)通過(guò)音量鍵調(diào)節(jié)到最大音量時(shí),會(huì)彈出一個(gè)Toast,提示 用戶(hù)當(dāng)前音量已經(jīng)最大了,繼續(xù)按音量上鍵可以設(shè)置為超大音量模式(通過(guò)調(diào)節(jié)音頻文件的音量)。剛開(kāi)始,我們?cè)贏(yíng)pp中是監(jiān)聽(tīng)名稱(chēng)為“AVSystemController_SystemVolumeDidChangeNotification”的系統(tǒng)通知來(lái)獲知用戶(hù)通過(guò)側(cè)邊音量鍵調(diào)節(jié)手機(jī)音量的事件。
[[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)問(wèn)題
這段代碼在我們這個(gè)App中工作的一直很好。但是最近一段時(shí)間,測(cè)試人員編譯版本,有時(shí)音量調(diào)節(jié)到最大后,沒(méi)有彈出Toast提示,而有時(shí)又會(huì)彈出來(lái)。經(jīng)調(diào)試,發(fā)現(xiàn)有時(shí)候能監(jiān)聽(tīng)到“AVSystemController_SystemVolumeDidChangeNotification”系統(tǒng)通知,有時(shí)候又沒(méi)有,很飄忽不定。一時(shí)間大家都不知道怎么回事,很是頭疼。因?yàn)檫@個(gè)代碼在之前發(fā)布出去的正式版本中,從來(lái)沒(méi)有出現(xiàn)過(guò)這樣的問(wèn)題。
定位問(wèn)題
以前版本沒(méi)有,而現(xiàn)在的版本有,說(shuō)明肯定是改出來(lái)的問(wèn)題。只有checkout到之前的commit,逐一測(cè)試找出是哪次提交造成這樣的問(wèn)題。但是這樣折騰了好久也沒(méi)能定位到是哪次提交造成的。最后,折騰了一天,我們這邊的一位美女同事Sharon最后解決了這個(gè)問(wèn)題,她在stackoverflow上找到了類(lèi)似的問(wèn)題,發(fā)現(xiàn)是我們刪除之前通過(guò)耳機(jī)線(xiàn)控App的一個(gè)Feature時(shí),把這段代碼刪掉了造成的。而這段代碼是開(kāi)始監(jiān)聽(tīng)遠(yuǎn)程控制事件。
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
NSNotificationCenter監(jiān)聽(tīng)的通知“AVSystemController_SystemVolumeDidChangeNotification”居然和RemoteControlEvents有關(guān)系,是因?yàn)槎鷻C(jī)線(xiàn)上也有音量調(diào)節(jié)按鍵的原因???有知道的朋友們可以留言交流。
ios如何監(jiān)聽(tīng)靜音鍵
判斷是否靜音:
- (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)聽(tīng)靜音鍵:
- (BOOL)addMutedListener { OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self); return s == kAudioSessionNoError; }
回調(diào)函數(shù):
void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue ) { if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return; BOOL muted = [mediaVolume isMuted]; // add code here }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
iOS源碼閱讀必備知識(shí)之Tagged Pointer
這篇文章主要給大家介紹了關(guān)于iOS源碼閱讀必備知識(shí)之Tagged Pointer的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07IOS中UIWebView加載Loading的實(shí)現(xiàn)方法
最近有朋友問(wèn)我類(lèi)似微信語(yǔ)音播放的喇叭動(dòng)畫(huà)和界面圖片加載loading界面是怎樣實(shí)現(xiàn)的,是不是就是一個(gè)gif圖片呢!我的回答當(dāng)然是否定了,當(dāng)然不排除也有人用gif圖片?。?/div> 2015-05-05iOS開(kāi)發(fā) 正則運(yùn)算詳細(xì)介紹
這篇文章主要介紹了iOS開(kāi)發(fā) 正則運(yùn)算的相關(guān)資料,需要的朋友可以參考下2016-09-09IOS 開(kāi)發(fā)之PickerView自定義視圖的實(shí)例詳解
這篇文章主要介紹了IOS 開(kāi)發(fā)之PickerView自定義視圖的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下2017-08-08iOS實(shí)現(xiàn)文件切片儲(chǔ)存并且上傳(仿斷點(diǎn)續(xù)傳機(jī)制)
這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)文件切片儲(chǔ)存并上傳仿斷點(diǎn)續(xù)傳機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12KVO實(shí)現(xiàn)自定義文件復(fù)制進(jìn)度效果
這篇文章主要為大家詳細(xì)介紹了KVO實(shí)現(xiàn)自定義文件復(fù)制進(jìn)度效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08iOS開(kāi)發(fā)中CAlayer層的屬性以及自定義層的方法
這篇文章主要介紹了iOS開(kāi)發(fā)中CAlayer層的屬性以及自定義層的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11最新評(píng)論