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

所属分类: 软件编程 / IOS 阅读数: 1703
收藏 0 赞 0 分享

前言

我们的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 
} 

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

更多精彩内容其他人还在看

iOS开发笔记--详解UILabel的相关属性设置

这篇文章主要介绍了iOS开发笔记--详解UILabel的相关属性设置,对初学者具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

iOS中获取系统相册中的图片实例

这篇文章主要介绍了iOS中获取系统相册中的图片实例,具有一定的参考价值没有需要的朋友可以了解一下。
收藏 0 赞 0 分享

iOS 检测网络状态的两种方法

一般有Reachability和AFNetworking监测两种方式,都是第三方的框架,下文逐一详细给大家讲解,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

IOS 性能优化中离屏渲染

本文主要介绍了IOS 性能优化中离屏渲染的资料,提供了几种方法讲解了优化,有需要的小伙伴可以参考下
收藏 0 赞 0 分享

iOS获取当前设备型号等信息(全)包含iPhone7和iPhone7P

这篇文章主要介绍了iOS获取当前设备型号设备信息的总结包含iPhone7和iPhone7P,包括ios7之前之后的获取方式,本文接的非常详细,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS实现爆炸的粒子效果示例代码

之前在网上看到了一个Android实现的爆炸效果,感觉非常不错,所以自己尝试用iOS来实现下效果,现在将实现的过程、原理以及遇到的问题分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

iOS毕业设计之天气预报App

这篇文章主要为大家详细介绍了iOS毕业设计之天气预报App,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS轻点、触摸和手势代码开发

这篇文章主要为大家详细介绍了iOS轻点、触摸和手势代码开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS 实现多代理的方法及实例代码

这篇文章主要介绍了iOS 实现多代理的方法及实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS文字渐变色效果的实现方法

在大家日常开发iOS的过程中,可能会遇到要实现文字渐变色的效果,这篇文章文章通过示例代码和详细的步骤介绍了如何利用iOS实现文字渐变色的效果,实现后的很不错,感兴趣的朋友们下面来一起看看吧。
收藏 0 赞 0 分享
查看更多