2012-04-23 2 views
14

Я хочу изменить громкость устройства на iOS (iphone).Как сменить громкость устройства на iOS - не музыкальный том

Я знаю, что я могу изменить громкость музыкальной библиотеки с ниже этой линии:

//implement at first MediaPlayer framework 
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer]; 
musicPlayer.volume = 1; 

Но это еще не моя цель.
Я хочу изменить объем устройства или позвольте мне сказать объем ringer.

Как я могу это сделать? просто измените DEVICE том?

ответ

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 
+8

Примечание: это устарело в iOS 7 –

+1

http://stackoverflow.com/a/24993026/2380455 – ambientlight

17

Чтобы ответить на вопрос brush51 в:

Как я могу сделать это? просто измените объем DEVICE?

Как 0x7fffffff предложил:

Вы не можете изменить громкость устройства программно, однако MPVolumeView (объем слайдера) есть, чтобы изменить громкость устройства, но только через взаимодействие с пользователем.

Так, Apple рекомендует использовать MPVolumeView, так что я пришел с этим:

Добавить volumeSlider недвижимость:

@property (nonatomic, strong) UISlider *volumeSlider; 

Init 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).

+0

Вы когда-нибудь проверяли это? Вы отказались для изменения объема программно? – iCaramba

+0

Это звучит как трюк – onmyway133

+0

Не работает для меня на ios 7.1 и 8. Значение слайдера изменяется, но объем звука в системе не работает. – Dvole

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) 
     } 
    } 
} 

В собственности volume в MPMusicPlayerController был принизить в прошивке 7.Это единственный способ, которым вы можете это сделать.

+1

Мне любопытно, в то время как это работает, прошло ли это через обзор App Store? –

2

Вот небольшой класс обертки, который может установить системный том и также уведомить вас о любых изменениях (передайте свой собственный ответ на изменение в 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

Это решение (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--- 

} 
+0

Спасибо за это - спасли меня несколько часов или больше, пытаясь понять, как получить доступ к этому слайдеру. Я должен сказать, что это так бессмысленно на части Яблока - мое приложение - все жесты, а слайдеру нет места. Надеюсь, они не отклонятся на этом основании. Я оставляю замечательную заметку в коде. – solenoid

+1

Всего несколько заметок: изменение объема вне приложения (например, центра управления) приведет к тому, что это больше не будет работать. Это может быть то, где я его использовал, но я ставлю его глобальным var в appDelegate и, похоже, работает. Во многих случаях я также получил начальную ценность 0. volumeView.setNeedsLayout() в какой-то момент, прежде чем get/set of values ​​исправляет эту проблему. – solenoid

0

Swift 3 - я использую это:

func setVolumeTo(volume: Float) { 
    (MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false) 
} 
Смежные вопросы