判断是否静音:

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);

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐