在ios中可以使用MPVolumeView来调节音量,缺点是UI是固定的,而且静音的时候会显示“No Volume Available”。自定义的volume view能避免这些问题。
自定义的volume view的UI部分比较好实现,在这里主要谈下静音键和音量键事件的处理。
注:使用前需要添加头文件 #import <MediaPlayer/MediaPlayer.h>
判断是否静音:(该方法在ios5中被取消了)
- (BOOL)isMuted { CFStringRef route; UInt32 routeSize = sizeof(CFStringRef);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &routeSize, &route); if (status == kAudioSessionNoError) { if (route == NULL || !CFStringGetLength(route)) return TRUE; }
return FALSE; }
监听静音键:
- (BOOL)addMutedListener { OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, self); return s == kAudioSessionNoError; } 回调函数:
void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue ) { if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return; BOOL muted = [self isMuted]; // add code here }
设置和获取音量:
- (float)volume { return [[MPMusicPlayerController applicationMusicPlayer] volume]; }
- (void)setVolume:(float)newVolume { [[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume]; }
监听音量键:
- (BOOL)addHardKeyVolumeListener { OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume, audioVolumeChangeListenerCallback, self); return s == kAudioSessionNoError; }
音量键回调函数:
void audioVolumeChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue) { if (inPropertyID != kAudioSessionProperty_CurrentHardwareOutputVolume) return; Float32 value = *(Float32 *)inPropertyValue; MediaVolume *mediaVolume = (MediaVolume *)inUserData; // add code here }