前言
我们的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 }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
在Android上怎么做? 感谢您发布一些有用的资源。
本文向大家介绍vue 手机物理监听键+退出提示代码,包括了vue 手机物理监听键+退出提示代码的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 代码很简单,逻辑也不是很复杂。但是要说一下为什么要用setTime( )。 我是在vue的index.html里面加的这些代码。在没有添加setTime()的时候不知道为啥他不执行,检查好几遍也没有错。最后请教的大佬,他也
问题内容: 我目前正在尝试为Android创建一个小的远程应用程序,以控制PC上的MediaPlayer(如Rythmbox)。 大多数媒体播放器都可以理解键盘上的特殊键(例如“播放/暂停”或“下一个/上一个”)。我的想法是Android App向PC发送命令(例如“ pause”)。在PC上运行一个普通的Java应用程序,该应用程序接收此命令并模拟对此特殊按钮的按键操作。 这样做的好处是,您可以
在关于克里特岛方法的主要活动中,我补充说: 恳求我能给我一些帮助,想。
按键音 可关闭按钮的按键音。 关 消除按键音 开 发生按键音
本文向大家介绍Android中Home键的监听和拦截示例,包括了Android中Home键的监听和拦截示例的使用技巧和注意事项,需要的朋友参考一下 首先大家应该先了解一种情况,就是Android在应用中是无法拦截Home键的,今天我们带大家看一下Home键的三种情况。 1、在应用中按下Home键的逻辑处理 当我们在应用中按下Home键时界面会启动到桌面,我们在frameworks\base\pol