iOS正确监听手机静音键和侧边音量键的方法示例

2025-05-29 0 76

前言

我们的App有这样一个Feature,用户通过音量键调节到最大音量时,会弹出一个Toast,提示 用户当前音量已经最大了,继续按音量上键可以设置为超大音量模式(通过调节音频文件的音量)。刚开始,我们在App中是监听名称为“AVSystemController_SystemVolumeDidChangeNotification”的系统通知来获知用户通过侧边音量键调节手机音量的事件。

?

1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onVolumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];

处理该通知的方法如下:

?

1

2

3

4

5

6

7

8

9

10

11

12
- (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时,把这段代码删掉了造成的。而这段代码是开始监听远程控制事件。

?

1
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

NSNotificationCenter监听的通知“AVSystemController_SystemVolumeDidChangeNotification”居然和RemoteControlEvents有关系,是因为耳机线上也有音量调节按键的原因???有知道的朋友们可以留言交流。

ios如何监听静音键

判断是否静音:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
- (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;

}

监听静音键

?

1

2

3

4

5

6

7
- (BOOL)addMutedListener

{

OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,

audioRouteChangeListenerCallback,

self);

return s == kAudioSessionNoError;

}

回调函数:

?

1

2

3

4

5

6

7

8

9

10
void audioRouteChangeListenerCallback (void *inUserData,

AudioSessionPropertyID inPropertyID,

UInt32 inPropertyValueSize,

const void *inPropertyValue

)

{

if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;

BOOL muted = [mediaVolume isMuted];

// add code here

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对快网idc的支持。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 iOS正确监听手机静音键和侧边音量键的方法示例 https://www.kuaiidc.com/89439.html

相关文章

发表评论
暂无评论