如何在iOS上更改设备音量 – 而不是音乐音量
我想更改iOS(iPhone)上的设备音量。
我知道我可以用下面这行代码来改变音乐库的音量:
//implement at first MediaPlayer framework MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer]; musicPlayer.volume = 1;
但那不是我的目标。
我想改变设备音量或让我说铃声的音量。
我怎样才能做到这一点? 只需更改DEVICE音量?
回答brush51的问题:
我怎样才能做到这一点? 只需更改DEVICE音量?
由于0x7fffffffbuild议:
您不能以编程方式更改设备音量,但是MPVolumeView(音量滑块)可以更改设备音量,但只能通过用户交互。
所以,苹果build议使用MPVolumeView
,所以我想出了这个:
添加volumeSlider
属性:
@property (nonatomic, strong) UISlider *volumeSlider;
初始化MPVolumeView
并添加到您的视图的某个地方(可以隐藏,没有框架或空的,因为showsRouteButton = NO
和showsVolumeSlider = NO
):
MPVolumeView *volumeView = [MPVolumeView new]; volumeView.showsRouteButton = NO; volumeView.showsVolumeSlider = NO; [self.view addSubview:volumeView];
查找并保存对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; } }];
为UIControlEventValueChanged
添加目标操作:
[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];
然后检测音量变化(即通过硬件音量控制):
- (void)handleVolumeChanged:(id)sender { NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value); }
也可以通过其他方式设置音量:
self.volumeSlider.value = < some value between 0.0f and 1.0f >;
希望这有助于(并且苹果不会从MPVolumeView中删除MPVolumeSlider)。
以下是我所做的:
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) } } }
由于MPMusicPlayerController
中的属性volume
在iOS 7中MPMusicPlayerController
被废弃。这只是您可以做到的方法。
您必须使用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
这个(Swift)解决scheme对我来说很好用: 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--- }
这是一个小包装类,可以设置系统音量,并通知您任何更改(将您自己的更改响应者传递给setTarget:action :)。
编辑 :如果您隐藏MPVolumeView控件或不添加它作为子视图,则系统将显示屏幕中间的默认音量平方,每当您以编程方式更改音量。 如果你不喜欢系统的function,解决方法是在屏幕外面设置视图坐标。 我编辑了一下我的代码来反映这一点。
@import MediaPlayer; @interface SysVolumeControl : MPVolumeView @property (nonatomic) float value; // from 0 to 1.0 - (void)setTarget:(id)target action:(SEL)action; @end @implementation SysVolumeControl { UISlider* _slider; } - (id)init { if (self = [super initWithFrame:CGRectMake(-300, 0, 200, 50)]) { for (UIView* view in self.subviews) { if ([view isKindOfClass:UISlider.class]) { _slider = (UISlider*)view; break; } } } return self; } - (float)value { return _slider.value; } - (void)setValue:(float)value { _slider.value = value; } - (void)setTarget:(id)target action:(SEL)action { [_slider addTarget:target action:action forControlEvents:UIControlEventValueChanged]; } @end
然后创build一个实例并使用它:
SysVolumeControl* sysVolumeControl = [SysVolumeControl new]; [myView addSubview:sysVolumeControl]; sysVolumeControl.value = 1.0; [sysVolumeControl setTarget:self action:@selector(mySysVolumeResponder:)];
Swift 3 – 我使用这个:
func setVolumeTo(volume: Float) { (MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false) }