前言
我们的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有关系,是因为耳机线上也有音量调节按键的原因???有知道的朋友们可以留言交流。
判断是否静音:
|
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的支持。
相关文章
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-06-04 87
-
2025-05-25 20
-
2025-05-29 117
-
2025-05-27 29
-
2025-05-25 85

