自定義實現MPVolumeView音量控件

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


用這個方法可以繞過那些麻煩的底層控制,用官方寫好的東西,達到我們要的效果。
大家試試看,看看行不行~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章