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

判断是否静音:

viewplain copytoclipboard print ?
  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. }  

监听静音键:

viewplain copytoclipboard print ?
  1. - (BOOL)addMutedListener  
  2. {  
  3.     OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,  
  4.                                                  audioRouteChangeListenerCallback,  
  5.                                                  self);  
  6.     return s == kAudioSessionNoError;  
  7. }  

回调函数:

viewplain copytoclipboard print ?
  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. }  

设置和获取音量:

viewplain copytoclipboard print ?
  1. - (float)volume  
  2. {  
  3.     return [[MPMusicPlayerController applicationMusicPlayer] volume];  
  4. }  
  5.   
  6. - (void)setVolume:(float)newVolume  
  7. {  
  8.     [[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume];  
  9. }  

监听音量键:

viewplain copytoclipboard print ?
  1. - (BOOL)addHardKeyVolumeListener  
  2. {  
  3.     OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,  
  4.                                                  audioVolumeChangeListenerCallback,  
  5.                                                  self);  
  6.     return s == kAudioSessionNoError;  
  7. }  

音量键回调函数:

viewplain copytoclipboard print ?
  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 alistener for Outputvolume
   AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,
                                   volumeListenerCallback,
                                   self
                                   );


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

3. 获取当前的volume
    float volume = 0.0;
    UInt32dataSize = sizeof(float);
    OSStatusstatus = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputVolume,
                            &dataSize,
                            &volume);

你可能感兴趣的:(ios监听静音键和音量键事件)