如何在iOS上更改设备音量 - 而不是音乐音量

bru*_*h51 15 iphone volume device ios

我想在iOS(iphone)上更改设备音量.

我知道我可以通过以下这些方式改变音乐库的音量:

//implement at first MediaPlayer framework
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
musicPlayer.volume = 1;
Run Code Online (Sandbox Code Playgroud)

但这不是我的目标.
我想更改设备音量或者让我说一下铃声的音量.

我怎样才能做到这一点?只是更改DEVICE卷?

msr*_*jan 17

要回答brush51的问题:

我怎样才能做到这一点?只是更改DEVICE卷?

正如0x7fffffff建议:

您无法以编程方式更改设备卷,但MPVolumeView(音量滑块)可用于更改设备音量,但仅通过用户交互.

所以,Apple建议使用MPVolumeView,所以我想出了这个:

添加volumeSlider属性:

@property (nonatomic, strong) UISlider *volumeSlider;
Run Code Online (Sandbox Code Playgroud)

初始化MPVolumeView并添加到视图的某个位置(可以隐藏,不带帧,或因为showsRouteButton = NO和而为空showsVolumeSlider = NO):

MPVolumeView *volumeView = [MPVolumeView new];
volumeView.showsRouteButton = NO;
volumeView.showsVolumeSlider = NO;
[self.view addSubview:volumeView];
Run Code Online (Sandbox Code Playgroud)

查找并保存参考UISlider:

__weak __typeof(self)weakSelf = self;
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UISlider class]]) {
        __strong __typeof(weakSelf)strongSelf = weakSelf;
        strongSelf.volumeSlider = obj;
        *stop = YES;
    }
}];
Run Code Online (Sandbox Code Playgroud)

添加目标操作UIControlEventValueChanged:

[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];
Run Code Online (Sandbox Code Playgroud)

然后检测音量变化(即通过硬件音量控制):

- (void)handleVolumeChanged:(id)sender
{
    NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value);
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法,您可以通过以下方式设置音量:

self.volumeSlider.value = < some value between 0.0f and 1.0f >;
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助(并且Apple不会从MPVolumeView中删除MPVolumeSlider).


Nik*_*nov 8

这就是我所做的:

func setSystemVolume(volume: Float) {
    let volumeView = MPVolumeView()

    for view in volumeView.subviews {
        if (NSStringFromClass(view.classForCoder) == "MPVolumeSlider") {
            let slider = view as! UISlider
            slider.setValue(volume, animated: false)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于属性volumeMPMusicPlayerControlleriOS 7 中已弃用.这是您可以执行此操作的唯一方法.


Pau*_*cum 6

您必须使用applicationMusicPlayer而不是iPodMusicPlayer来设置系统音量:

#import <MediaPlayer/MediaPlayer.h>
musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
musicPlayer.volume = 1; // max volume
musicPlayer.volume = 0; // min volume (mute)
musicPlayer.volume = 0.0625; // 1 bar on the overlay volume display
Run Code Online (Sandbox Code Playgroud)

  • 注意:这在iOS 7中已弃用 (9认同)

Lar*_*335 6

这个(Swift)解决方案对我很有帮助:http: //weimenglee.blogspot.com/2015/07/ios-tip-programmatically-adjust-device.html

import MediaPlayer

let volumeView = MPVolumeView()
if let view = volumeView.subviews.first as? UISlider{
    view.value = 0.1 //---0 t0 1.0---

}
Run Code Online (Sandbox Code Playgroud)

  • 只是一些注意事项:在应用程序外(如控制中心)更改音量会导致此功能不再起作用。它可能是我使用它的地方,但我把它作为 appDelegate 中的全局变量,它似乎工作。在许多情况下,我的起始值也为 0。volumeView.setNeedsLayout() 在获取/设置值之前的某个时间点修复了该问题。 (3认同)
  • 这在iOS 11.4中不再起作用 (2认同)