ios监听静音键和音量键事件

转自:http://blog.sina.com.cn/s/blog_67b7cb7b0101kilj.html

ios监听静音键和音量键事件

  (2013-05-02 11:41:43)

判断是否静音:

  1. (BOOL)isMuted  
  2.  
  3.     CFStringRef route;  
  4.     UInt32 routeSize sizeof(CFStringRef);  
  5.   
  6.     OSStatus status AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &routeSize, &route);  
  7.     if (status == kAudioSessionNoError)  
  8.      
  9.         if (route == NULL || !CFStringGetLength(route))  
  10.             return TRUE;  
  11.      
  12.   
  13.     return FALSE;  
  14.  

监听静音键:

  1. (BOOL)addMutedListener  
  2.  
  3.     OSStatus AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,  
  4.                                                  audioRouteChangeListenerCallback,  
  5.                                                  self);  
  6.     return == kAudioSessionNoError;  
  7.  

回调函数:

  1. void audioRouteChangeListenerCallback (void *inUserData,  
  2.                                        AudioSessionPropertyID inPropertyID,  
  3.                                        UInt32 inPropertyValueSize,  
  4.                                        const void *inPropertyValue  
  5.                                         
  6.  
  7.     if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return 
  8.     BOOL muted [mediaVolume isMuted];  
  9.     // add code here  
  10.  

设置和获取音量:

  1. (float)volume  
  2.  
  3.     return [[MPMusicPlayerController applicationMusicPlayer] volume];  
  4.  
  5.   
  6. (void)setVolume:(float)newVolume  
  7.  
  8.     [[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume];  
  9.  

监听音量键:

  1. (BOOL)addHardKeyVolumeListener  
  2.  
  3.     OSStatus AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,  
  4.                                                  audioVolumeChangeListenerCallback,  
  5.                                                  self);  
  6.     return == kAudioSessionNoError;  
  7.  

音量键回调函数:

  1. void audioVolumeChangeListenerCallback (void *inUserData,  
  2.                                         AudioSessionPropertyID inPropertyID,  
  3.                                         UInt32 inPropertyValueSize,  
  4.                                         const void *inPropertyValue)  
  5.  
  6.     if (inPropertyID != kAudioSessionProperty_CurrentHardwareOutputVolume) return 
  7.     Float32 value *(Float32 *)inPropertyValue;  
  8.     MediaVolume *mediaVolume (MediaVolume *)inUserData;  
  9.     // add code here  
  10.  


方法1:
     在applicationDidFinishLaunching函数里添加
      [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(volumeChanged:)
                                             name:@"AVSystemController_SystemVolumeDidChangeNotification"
                                             object:nil];

  - (void)volumeChanged:(NSNotification *)notification
{
    float volume =
    [[[notification userInfo]
      objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"]
     floatValue];
    
    DDLogVerbose(@"current volume = %f", volume);   
}

   弊端:当app进入后天后,依然会监听到volume的变化

2. 对 AudioSession 添加volume变化的 listener, 可以放在startAudioSession函数里
    //add a listener for Outputvolume
    AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume ,
                                    volumeListenerCallback,
                                    self
                                    );


void volumeListenerCallback (
                             void                      *inClientData,
                             AudioSessionPropertyID    inID,
                             UInt32                    inDataSize,
                             const void                *inData
                             ){
    const float *volumePointer = inData;
    float volume = *volumePointer;
    NSLog(@"volumeListenerCallback %f", volume);
}

3. 获取当前的volume
     float volume = 0.0;
    UInt32 dataSize = sizeof(float);
    OSStatus status = AudioSessionGetProperty (kAudioSessionProperty_CurrentHardwareOutputVolume,
                             &dataSize,
                             &volume);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值