iOS 控制系统的音量改变

来源:互联网 发布:科怡软件3.3 编辑:程序博客网 时间:2024/06/01 07:23

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)并没有在视图层级中,系统的音量提示框还会展示



监控系统音量

请参考另一篇文章







0 0
原创粉丝点击