自定义实现MPVolumeView音量控件

来源:互联网 发布:校园网用户mac地址错误 编辑:程序博客网 时间:2024/06/08 15:41

http://blog.csdn.net/theonezh/article/details/8158420

http://www.cnblogs.com/cate/ios/

http://www.cnblogs.com/pinping/archive/2012/10/12.html

http://www.cnblogs.com/entlibforum/archive/2012/10/16/2725411.html

http://www.cocoachina.com/applenews/devnews/2012/1114/5085.html



http://mobilesolutions.blog.163.com/blog/static/189224176201111725559550/


iOS中可以使用MPVolumeView来调节音量,缺点是UI是固定的,而且静音的时候会显示“No Volume Available”。自定义的volume view能避免这些问题。

自定义的volume view的UI部分比较好实现,在这里主要谈下静音键和音量键事件的处理。

判断是否静音:

- (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 = [mediaVolume 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

}








修改系统音量(SystemVolume)的方法   



看到很多朋友在问能不能修改系统的音量,所以我也去找了一下。

发现,SDK中确实有设置system volume的方法,是一个private class,官方不允许使用,所以就算你用了,苹果的审核也不会通过,因为标明了,那个是私有的类!


还有人提到MPVolumeView,这个可以,但是这个的实现,是在屏幕中创建一个音量条,来取代原来按侧边键出来的大喇叭。

是可以达到同步设置的。但是音量只能由用户手动拖动音量条控制。

附上简单的使用代码,因为我是在cocos2d里面试的,所以就加到window里面了。


MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:window.bounds] autorelease];

[window addSubview:volumeView]; 

[volumeView sizeToFit];


我找了一下,发现一个类,就是MPMusicPlayerController。我们用来播放音乐的。MPVolumeView应该算是其中的一个组件吧。

这个类有一个值,volume~可以直接设置,而且,最总要的是,他可以同步系统音量,且不会显示出来。


用法很简单。

MPMusicPlayerController *mpc = [MPMusicPlayerController applicationMusicPlayer];

mpc.volume = 0;  //0.0~1.0


用这个方法可以绕过那些麻烦的底层控制,用官方写好的东西,达到我们要的效果。

大家试试看,看看行不行~


0 0
原创粉丝点击