iOS监听音量调节事件
方法一:
Appdelegate.m中,添加头文件
#includ
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
方法中添加
- AudioSessionInitialize(NULL,NULL,NULL,NULL);
- AudioSessionSetActive(true);
- AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,volumeListenerCallback, (__bridgevoid *)(self));
-
外加回调函数
- #import<AudioToolbox/AudioToolbox.h>
- voidvolumeListenerCallback (void *inClientData,
- AudioSessionPropertyID inID,
- UInt32 inDataSize,
- const void *inData) {
-
- const double *volumePointer = inData;
- float volume = *volumePointer;
- NSLog(@"volumeListenerCallback %f", volume);
- //[[NSNotificationCenter defaultCenter] postNotificationName:KNotificationVolumeChange object:nil];
- }
- @interfaceAppDelegate ()
方法二:
添加通知:
- [[AVAudioSession sharedInstance] addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:(voidvoid *)[AVAudioSession sharedInstance]];
然后添加通知方法:
- - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context{
- if(context == (__bridge voidvoid *)[AVAudioSession sharedInstance]){
- float newValue = [[change objectForKey:@"new"] floatValue];
- float oldValue = [[change objectForKey:@"old"] floatValue];
- // TODO: 这里实现你的逻辑代码
- }
- }
注意: 此种方法实现很简单, 但是使用效果不是很好, 具体哪里不好, 这里就不做解释 有兴趣的可以自己试试
方法三:
这中方法较为简单实用
添加MediaPlayer.framework (可以让调节音量的view 不显示在界面 如果没有这需求可以不添加)
AVFoundation.framework
在Appdelegate.m中
导入#import <AVFoundation/AVFoundation.h>
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中添加
- AVAudioSession *session = [AVAudioSession sharedInstance];
- [session setActive:YES error:nil];
- [session setCategory:AVAudioSessionCategoryPlayback error:nil];
- NSError *error;
- [[AVAudioSession sharedInstance] setActive:YES error:&error];
- //注,ios9上不加这一句会无效
- [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
在使用的ViewController的- (void)viewDidLoad方法中添加通知
- //监听音量调节
- [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
实现方法:
- -(void)volumeChanged:(NSNotification *)noti {
- float volume = [[[noti userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
- NSLog(@"volumn is %f", volume);
- //这里做你想要的进行的操作
- }
注意事项 1 : 此方法使用时候测试到 长按home键调出Siri后也会调用这个调用这个通知方法 以及再点击home键退出Siri时候还会调一次这个方法
解决方案:
- -(void)volumeChanged:(NSNotification *)noti {
- float volume = [[[noti userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
- NSLog(@"volumn is %f", volume);
- NSString *str1 = [[noti userInfo]objectForKey:@"AVSystemController_AudioCategoryNotificationParameter"];
- NSString *str2 = [[noti userInfo]objectForKey:@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"];
- if (([str1 isEqualToString:@"Audio/Video"] || [str1 isEqualToString:@"Ringtone"]) && ([str2 isEqualToString:@"ExplicitVolumeChange"])) {
- <pre name="code" class="objc"> //这里做你想要的进行的操作
- }
- }
注意事项 2 : 应用进入后台运行时不让响应音量调节事件
解决方案: 添加一个BOOL变量isIntoBg 在- (void)viewDidLoad方法中添加通知
- //进入后台
- [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(intoBackg) name:UIApplicationDidBecomeActiveNotification object:nil];
- //进入前台
- [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(returnBackg) name:UIApplicationWillResignActiveNotification object:nil];
实现方法:
- - (void)intoBackg
- {
- NSLog(@"***************后台出来*****************");
- isIntoBg = NO;
- }
-
- - (void)returnBackg
- {
- NSLog(@"***************进入后台*****************");
- isIntoBg = YES;
- }
当然通知方法中也要进行判断一下
- -(void)volumeChanged:(NSNotification *)noti {
- float volume = [[[noti userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
- NSLog(@"volumn is %f", volume);
- NSString *str1 = [[noti userInfo]objectForKey:@"AVSystemController_AudioCategoryNotificationParameter"];
- NSString *str2 = [[noti userInfo]objectForKey:@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"];
- //此处判断将音量调节和铃声调节都包括进来进行响应
- if (([str1 isEqualToString:@"Audio/Video"] || [str1 isEqualToString:@"Ringtone"]) && ([str2 isEqualToString:@"ExplicitVolumeChange"])) {
- if(isIntoBg == NO){
- //这里做你想要的进行的操作
- }
- }
- }
注意事项 3: 只在这个界面响应监听音量调节的事件
解决方案:
- -(void)viewWillAppear:(BOOL)animated {
- [super viewWillAppear:YES];
- isIntoBg = NO;
- }
-
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
- isIntoBg = YES;
- }
注意事项 4: 不显示系统的音量视图
解决方案:
导入#import <MediaPlayer/MediaPlayer.h>
在viewdidload中新增一个音量视图替换掉系统的音量视图
- MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(0, 0, 200, 20)];
-
- volumeView.center = CGPointMake(-550,370);//设置中心点,让音量视图不显示在屏幕中
-
- [volumeView sizeToFit];
-
- [self.view addSubview:volumeView];
版权声明:本文为博主原创文章,未经博主允许不得转载。