iOS 控制系統的音量改變

iOS的AVFoundation框架提供了基本的音視頻播放工具,我們基本上可以靠其中提供的類完成絕大部分的音視頻播放任務。但是在音頻播放的輸出音量的處理上,蘋果的策略比較保守。儘管AVPlayerAVPAudiolayerzhe這些類提供了音量調節功能,但這些音量控制屬於App級別的控制。好處就是音量調節獨立於系統音量,調節大小時不會影響系統音量。但有時候我們可能希望修改系統音量,以免在調節聲音的時候,如果系統音量過小,App調節音量效果不明顯。一般來說要調節系統音量會有以下方法:

請注意:

修改系統音量無法在模擬器上看到效果,必須使用真機調試才能看到效果!

使用前請導入庫 #import <MediaPlayer/MediaPlayer.h>

第一:通過 MPVolumeSettings 來控制系統的聲音

類裏面提供了三個方法控制聲音

MP_EXTERN __TVOS_PROHIBITED void MPVolumeSettingsAlertShow();
MP_EXTERN __TVOS_PROHIBITED void MPVolumeSettingsAlertHide();
MP_EXTERN __TVOS_PROHIBITED BOOL MPVolumeSettingsAlertIsVisible();

具體使用方法請參考另一篇文章 MPVolumeSettingsAlertShow

 


第二:通過MPVolumeView

可以先下載demo,以便更清晰的理解

這個方法是蘋果官方推薦的方法。MPVolumeView是Media Player Framework中的一個UI組件,直接包含了對系統音量和Airplay設備的音頻鏡像路由的控制功能。MPVolumeView的使用很簡單,只需要將其加入到一個父視圖中,給予父視圖合適的大小,再創建MPVolumeView示例,將其加入到父視圖中即可

但是他的缺點也是很明顯的:

1>MPVolumeView的可定製化是很低的,裏面提供了很少的幾個方法,並且幾乎都是用圖片來定製界面

2>將其假如到我們的視圖層級之後,顯示的是一個滑塊(UISlider),在APP中,大多時候音量的控制我們是要自己定製的,如在視頻的播放中

解決方法

但是MPVolumeView的子視圖中包含一個MPVolumeSlider的subview用來控制音量。這個MPVolumeSlider是一個私有類,我們無法手動創建此類,但這個類是UISlider的子類。於是我們便可以將這個控件給提取出來,便可以間接的控制系統音量,可以遍歷它的子視圖找到MPVolumeSlider

UISlider * volumeViewSlider = nil;

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(10, 50, 200, 4)];
        
       for (UIView* newView in volumeView.subviews) {
            if ([newView.class.description isEqualToString:@"MPVolumeSlider"]){
                volumeViewSlider = (UISlider*)newView;
                break;
            }
        }


我們只要改變得到的volumeViewSlider 的value 就可以間接的控制系統的音量

如下:

/*
 *獲取系統音量滑塊
 */
+(UISlider*)getSystemVolumSlider{
    static UISlider * volumeViewSlider = nil;
    if (volumeViewSlider == nil) {
        MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(10, 50, 200, 4)];
        
        for (UIView* newView in volumeView.subviews) {
            if ([newView.class.description isEqualToString:@"MPVolumeSlider"]){
                volumeViewSlider = (UISlider*)newView;
                break;
            }
        }
    }
    return volumeViewSlider;
}


/*
 *獲取系統音量大小
 */
+(CGFloat)getSystemVolumValue{
    return [[self getSystemVolumSlider] value];
}
/*
 *設置系統音量大小
 */
+(void)setSysVolumWith:(double)value{
    [self getSystemVolumSlider].value = value;
}


更多的需求:隱藏系統的音量提示框


 通過上面的方法獲取到控制音量的滑塊之後,當我們改變滑塊的value之後,系統的音量提示框會展示出來,

也許有的APP中要自己定義音量改變的提示框,於是便要隱藏系統的音量提示框


實現:

上面的 獲取 系統音量滑塊 的時候,並沒有將滑塊假如到我們的視圖中,如果將其假如到我們的視圖之中後,就會發現系統的音量提示框便不會展示,

可以知道:

音量滑塊 (volumeViewSlider)在視圖層級中,系統的音量提示框便不會展示,

音量滑塊 (volumeViewSlider)不在視圖層級中,系統的音量提示框便會展示,

這樣就好辦了,將音量滑塊 (volumeViewSlider)的座標調整到最低層級,或者將其座標設置爲負值如(-1000,-1000,100,4)

但是有一點要注意,不能將其 hidden 設置爲YES ,如果設置爲YES ,就會檢測到 音量滑塊 (volumeViewSlider)並沒有在視圖層級中,系統的音量提示框還會展示



監控系統音量

請參考另一篇文章







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章