iOS正確監(jiān)聽手機靜音鍵和側(cè)邊音量鍵的方法示例
前言
我們的App有這樣一個Feature,用戶通過音量鍵調(diào)節(jié)到最大音量時,會彈出一個Toast,提示 用戶當前音量已經(jīng)最大了,繼續(xù)按音量上鍵可以設(shè)置為超大音量模式(通過調(diào)節(jié)音頻文件的音量)。剛開始,我們在App中是監(jiān)聽名稱為“AVSystemController_SystemVolumeDidChangeNotification”的系統(tǒng)通知來獲知用戶通過側(cè)邊音量鍵調(diào)節(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中工作的一直很好。但是最近一段時間,測試人員編譯版本,有時音量調(diào)節(jié)到最大后,沒有彈出Toast提示,而有時又會彈出來。經(jīng)調(diào)試,發(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有關(guān)系,是因為耳機線上也有音量調(diào)節(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;
}
回調(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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程
這篇文章主要介紹了iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程,即用UINavigationController來編寫navigation,示例代碼為Objective-C語言,需要的朋友可以參考下2016-02-02
Flutter開發(fā)Widgets?之?PageView使用示例
這篇文章主要為大家介紹了Flutter開發(fā)Widgets?之?PageView使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10-
最新評論

