您的位置:首页 > 移动开发 > IOS开发

iOS监听音量调节事件

2017-11-07 16:59 936 查看

iOS监听音量调节事件

转载至:http://blog.csdn.net/lgx_admin/article/details/51658708


方法一:

添加AudioToolbox.framework

Appdelegate.m中,添加头文件#includ

[objc] view
plain copy

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions  

方法中添加

[objc] view
plain copy

   AudioSessionInitialize(NULL,NULL,NULL,NULL);
       AudioSessionSetActive(true);
       AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,volumeListenerCallback,
(__bridgevoid

*)(self));

    

外加回调函数

[objc] view
plain copy

#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

()


方法二:

添加通知:

[objc] view
plain copy

[[AVAudioSession sharedInstance] addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:(voidvoid *)[AVAudioSession sharedInstance]];  

然后添加通知方法:

[objc] view
plain copy

- (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>

[objc] view
plain copy

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions   

方法中添加

[objc] view
plain copy

   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方法中添加通知

[objc] view
plain copy

//监听音量调节  

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];  

实现方法:

[objc] view
plain copy

-(void)volumeChanged:(NSNotification *)noti  
{                                     

    float volume =  [[[noti userInfo]
objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];  

    NSLog(@"volumn is %f", volume);  

    //这里做你想要的进行的操作  

 }  


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

解决方案:

[objc] view
plain copy

-(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方法中添加通知

[objc] view
plain copy

//进入后台  

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(intoBackg) name:UIApplicationDidBecomeActiveNotification object:nil];  

    //进入前台  

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(returnBackg) name:UIApplicationWillResignActiveNotification object:nil];  

实现方法:

[objc] view
plain copy

- (void)intoBackg  

{  

    NSLog(@"***************后台出来*****************");  

    isIntoBg = NO;  

}  

  

- (void)returnBackg  

{  

    NSLog(@"***************进入后台*****************");  

    isIntoBg = YES;  

}  

当然通知方法中也要进行判断一下

[objc] view
plain copy

-(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: 只在这个界面响应监听音量调节的事件

解决方案:

[objc] view
plain copy

-(void)viewWillAppear:(BOOL)animated {  

    [super viewWillAppear:YES];  

    isIntoBg = NO;  

}  

  

- (void)viewWillDisappear:(BOOL)animated {  

    [super viewWillDisappear:animated];  

    isIntoBg = YES;  

}  


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

解决方案:

添加MediaPlayer.framework

导入#import <MediaPlayer/MediaPlayer.h>

在viewdidload中新增一个音量视图替换掉系统的音量视图

[objc] view
plain copy

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(0, 0, 200, 20)];  

  

    volumeView.center = CGPointMake(-550,370);//设置中心点,让音量视图不显示在屏幕中  

      

    [volumeView sizeToFit];  

      

    [self.view addSubview:volumeView];  

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: