当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS正确监听手机静音键和侧边音量键的方法示例

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

前言

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

总结

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网