Как изменить громкость устройства на iOS - не музыкальный объем
Я хочу изменить громкость устройства на iOS (iphone).
Я знаю, что я могу изменить громкость музыкальной библиотеки следующими строками:
//implement at first MediaPlayer framework
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
musicPlayer.volume = 1;
Но это не моя цель.
Я хочу изменить объем устройства или позвольте сказать громкость звонка.
Как я могу это сделать? просто измените громкость УСТРОЙСТВА?
Ответы
Ответ 1
Чтобы ответить на вопрос brush51:
Как я могу это сделать? просто измените объем УСТРОЙСТВА?
Как предположил 0x7fffffff:
Вы не можете изменять объем устройства программно, однако MPVolumeView (ползунок тома) предназначен для изменения объема устройства, но только через взаимодействие с пользователем.
Итак, Apple рекомендует использовать 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 >;
Надеюсь, что это поможет (и что Apple не удаляет MPVolumeSlider из MPVolumeView).
Ответ 2
Вот что я сделал:
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)
}
}
}
В качестве свойства volume
в MPMusicPlayerController
было отклонено в iOS 7. Это единственный способ, которым вы можете это сделать.
Ответ 3
Вы должны использовать 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
Ответ 4
Это (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---
}
Ответ 5
Вот небольшой класс-оболочка, который может установить системный том и также уведомить вас о любых изменениях (передайте свой собственный ответ на изменение в setTarget: action:).
Изменить. Если вы скроете элемент управления MPVolumeView или не добавите его в качестве подвью, тогда система будет показывать квадрат громкости по умолчанию в середине экрана всякий раз, когда вы программным образом изменяете громкость. Если вам не нравится то, что делает система, решение заключается в установке координат представления вне экрана. Я немного изменил свой код, чтобы отразить это.
@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
Затем создайте экземпляр и используйте его:
SysVolumeControl* sysVolumeControl = [SysVolumeControl new];
[myView addSubview:sysVolumeControl];
sysVolumeControl.value = 1.0;
[sysVolumeControl setTarget:self action:@selector(mySysVolumeResponder:)];
Ответ 6
Создание MPVolumeView на лету, чтобы получить ползунок и установить громкость, больше не работает в iOS 11.4. Я решил проблему, добавив новый MPVolumeView к моему представлению UIViewController, иначе он не установил громкость. Когда я добавил его в контроллер, мне также нужно установить положение просмотра громкости за пределами экрана.
Код в Swift 4:
let volumeControl = MPVolumeView(frame: CGRect(x: 0, y: 0, width: 120, height: 120))
override func viewDidLoad() {
self.view.addSubview(volumeControl);
}
override func viewDidLayoutSubviews() {
volumeControl.frame = CGRect(x: -120, y: -120, width: 100, height: 100);
}
func setMaxVolume() {
let lst = volumeControl.subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}
let slider = lst.first as? UISlider
slider?.setValue(1, animated: false)
}
Ответ 7
Swift 3 - я использую это:
func setVolumeTo(volume: Float) {
(MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false)
}
Ответ 8
Приложение не должно изменять глобальные настройки устройства, и вы не должны этого делать. Пользователь может сделать это, используя стандартные функции iOS. Вместо этого, если вы воспроизводите звук/видео, используйте volume
проигрывателя:
var player: AVPlayer!
...
player.volume = 0.5 // 50% level