您好,登錄后才能下訂單哦!
前言
我們的App有這樣一個Feature,用戶通過音量鍵調節到最大音量時,會彈出一個Toast,提示 用戶當前音量已經最大了,繼續按音量上鍵可以設置為超大音量模式(通過調節音頻文件的音量)。剛開始,我們在App中是監聽名稱為“AVSystemController_SystemVolumeDidChangeNotification”的系統通知來獲知用戶通過側邊音量鍵調節手機音量的事件。
[[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 } } } }
發現問題
這段代碼在我們這個App中工作的一直很好。但是最近一段時間,測試人員編譯版本,有時音量調節到最大后,沒有彈出Toast提示,而有時又會彈出來。經調試,發現有時候能監聽到“AVSystemController_SystemVolumeDidChangeNotification”系統通知,有時候又沒有,很飄忽不定。一時間大家都不知道怎么回事,很是頭疼。因為這個代碼在之前發布出去的正式版本中,從來沒有出現過這樣的問題。
定位問題
以前版本沒有,而現在的版本有,說明肯定是改出來的問題。只有checkout到之前的commit,逐一測試找出是哪次提交造成這樣的問題。但是這樣折騰了好久也沒能定位到是哪次提交造成的。最后,折騰了一天,我們這邊的一位美女同事Sharon最后解決了這個問題,她在stackoverflow上找到了類似的問題,發現是我們刪除之前通過耳機線控App的一個Feature時,把這段代碼刪掉了造成的。而這段代碼是開始監聽遠程控制事件。
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
NSNotificationCenter監聽的通知“AVSystemController_SystemVolumeDidChangeNotification”居然和RemoteControlEvents有關系,是因為耳機線上也有音量調節按鍵的原因???有知道的朋友們可以留言交流。
ios如何監聽靜音鍵
判斷是否靜音:
- (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; }
監聽靜音鍵:
- (BOOL)addMutedListener { OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self); return s == kAudioSessionNoError; }
回調函數:
void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue ) { if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return; BOOL muted = [mediaVolume isMuted]; // add code here }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。