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
在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
用這個方法可以繞過那些麻煩的底層控制,用官方寫好的東西,達到我們要的效果。
大家試試看,看看行不行~
發現,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
用這個方法可以繞過那些麻煩的底層控制,用官方寫好的東西,達到我們要的效果。
大家試試看,看看行不行~