判断是否静音:
viewplain copytoclipboard print ?
- (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;
}
监听静音键:
viewplain copytoclipboard print ?
- (BOOL)addMutedListener
{
OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self);
return s == kAudioSessionNoError;
}
回调函数:
viewplain copytoclipboard print ?
void audioRouteChangeListenerCallback (void *inUserData,
AudioSessionPropertyID inPropertyID,
UInt32 inPropertyValueSize,
const void *inPropertyValue
)
{
if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;
BOOL muted = [mediaVolume isMuted];
// add code here
}
设置和获取音量:
viewplain copytoclipboard print ?
- (float)volume
{
return [[MPMusicPlayerController applicationMusicPlayer] volume];
}
- (void)setVolume:(float)newVolume
{
[[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume];
}
监听音量键:
viewplain copytoclipboard print ?
- (BOOL)addHardKeyVolumeListener
{
OSStatus s = AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume,
audioVolumeChangeListenerCallback,
self);
return s == kAudioSessionNoError;
}
音量键回调函数:
viewplain copytoclipboard print ?
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
}
方法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);