iOS监听音量调节事件

iOS监听音量调节事件

方法一:

添加AudioToolbox.framework

Appdelegate.m中,添加头文件 #includ
[objc]  view plain   copy
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions  
方法中添加
[objc]  view plain   copy
  1.    AudioSessionInitialize(NULL,NULL,NULL,NULL);
  2.        AudioSessionSetActive(true);
  3.        AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,volumeListenerCallback, (__bridgevoid *)(self));
  4.     


外加回调函数
[objc]  view plain   copy
  1. #import<AudioToolbox/AudioToolbox.h>

  2. voidvolumeListenerCallback (void                      *inClientData,
  3.                             AudioSessionPropertyID    inID,
  4.                             UInt32                    inDataSize,
  5.                             const void                *inData) {
  6.    
  7.    const double *volumePointer = inData;
  8.    float volume = *volumePointer;
  9.    NSLog(@"volumeListenerCallback %f", volume);
  10.    //[[NSNotificationCenter defaultCenter] postNotificationName:KNotificationVolumeChange object:nil];
  11. }

  12. @interfaceAppDelegate ()


方法二:

添加通知:
[objc]  view plain   copy
  1. [[AVAudioSession sharedInstance] addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:(voidvoid *)[AVAudioSession sharedInstance]];  
然后添加通知方法:
[objc]  view plain   copy
  1. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context{  
  2.     if(context == (__bridge voidvoid *)[AVAudioSession sharedInstance]){  
  3.         float newValue = [[change objectForKey:@"new"] floatValue];  
  4.         float oldValue = [[change objectForKey:@"old"] floatValue];  
  5.         // TODO: 这里实现你的逻辑代码  
  6.     }  
  7. }  


注意: 此种方法实现很简单, 但是使用效果不是很好, 具体哪里不好, 这里就不做解释 有兴趣的可以自己试试

方法三:

这中方法较为简单实用
添加MediaPlayer.framework (可以让调节音量的view 不显示在界面   如果没有这需求可以不添加)
   AVFoundation.framework
在Appdelegate.m中
导入#import <AVFoundation/AVFoundation.h>

[objc]  view plain   copy
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions   
方法中添加
[objc]  view plain   copy
  1.    AVAudioSession *session = [AVAudioSession sharedInstance];  
  2.     [session setActive:YES error:nil];  
  3.     [session setCategory:AVAudioSessionCategoryPlayback error:nil];  
  4.    NSError *error;  
  5.     [[AVAudioSession sharedInstance] setActive:YES error:&error];  
  6.     //注,ios9上不加这一句会无效  
  7.     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];  
在使用的ViewController的- (void)viewDidLoad方法中添加通知
[objc]  view plain   copy
  1. //监听音量调节  
  2.     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];  


实现方法:
[objc]  view plain   copy
  1. -(void)volumeChanged:(NSNotification *)noti   {                                     
  2.     float volume =  [[[noti userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];  
  3.     NSLog(@"volumn is %f", volume);  
  4.     //这里做你想要的进行的操作  
  5.  }  


注意事项 1 : 此方法使用时候测试到 长按home键调出Siri后也会调用这个调用这个通知方法 以及再点击home键退出Siri时候还会调一次这个方法

解决方案:
[objc]  view plain   copy
  1. -(void)volumeChanged:(NSNotification *)noti  {                                     
  2.     float volume = [[[noti userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];  
  3.     NSLog(@"volumn is %f", volume);  
  4.     NSString *str1 = [[noti userInfo]objectForKey:@"AVSystemController_AudioCategoryNotificationParameter"];  
  5.     NSString *str2 = [[noti userInfo]objectForKey:@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"];  
  6.     if (([str1 isEqualToString:@"Audio/Video"] || [str1 isEqualToString:@"Ringtone"]) && ([str2 isEqualToString:@"ExplicitVolumeChange"]))  {  
  7.       <pre name="code" class="objc">      //这里做你想要的进行的操作  
  8.     }
  9. }

注意事项 2 : 应用进入后台运行时不让响应音量调节事件

解决方案: 添加一个BOOL变量isIntoBg   在- (void)viewDidLoad方法中添加通知
[objc]  view plain   copy
  1. //进入后台  
  2.     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(intoBackg) name:UIApplicationDidBecomeActiveNotification object:nil];  
  3.     //进入前台  
  4.     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(returnBackg) name:UIApplicationWillResignActiveNotification object:nil];  
实现方法:
[objc]  view plain   copy
  1. - (void)intoBackg  
  2. {  
  3.     NSLog(@"***************后台出来*****************");  
  4.     isIntoBg = NO;  
  5. }  
  6.   
  7. - (void)returnBackg  
  8. {  
  9.     NSLog(@"***************进入后台*****************");  
  10.     isIntoBg = YES;  
  11. }  


当然通知方法中也要进行判断一下
[objc]  view plain   copy
  1. -(void)volumeChanged:(NSNotification *)noti  {                                     
  2.     float volume = [[[noti userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];  
  3.     NSLog(@"volumn is %f", volume);  
  4.     NSString *str1 = [[noti userInfo]objectForKey:@"AVSystemController_AudioCategoryNotificationParameter"];  
  5.     NSString *str2 = [[noti userInfo]objectForKey:@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"];  
  6.     //此处判断将音量调节和铃声调节都包括进来进行响应  
  7.     if (([str1 isEqualToString:@"Audio/Video"] || [str1 isEqualToString:@"Ringtone"]) && ([str2 isEqualToString:@"ExplicitVolumeChange"]))    {  
  8.        if(isIntoBg == NO){             
  9.       //这里做你想要的进行的操作  
  10.        }  
  11.     }  
  12.  }  


注意事项 3: 只在这个界面响应监听音量调节的事件

解决方案:
[objc]  view plain   copy
  1. -(void)viewWillAppear:(BOOL)animated {  
  2.     [super viewWillAppear:YES];  
  3.     isIntoBg = NO;  
  4. }  
  5.   
  6. - (void)viewWillDisappear:(BOOL)animated {  
  7.     [super viewWillDisappear:animated];  
  8.     isIntoBg = YES;  
  9. }  


注意事项 4: 不显示系统的音量视图

解决方案:
添加MediaPlayer.framework

导入#import <MediaPlayer/MediaPlayer.h>

在viewdidload中新增一个音量视图替换掉系统的音量视图
[objc]  view plain   copy
  1. MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(0020020)];  
  2.   
  3.     volumeView.center = CGPointMake(-550,370);//设置中心点,让音量视图不显示在屏幕中  
  4.       
  5.     [volumeView sizeToFit];  
  6.       
  7.     [self.view addSubview:volumeView];  






版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值