2012-04-23 9 views
14

Quiero cambiar el volumen del dispositivo en iOS (iphone).Cómo cambiar el volumen del dispositivo en iOS - no el volumen de música

Yo sé que puedo cambiar el volumen de la biblioteca de música con estas líneas siguientes:

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

Pero eso no es mi objetivo.
Quiero cambiar el volumen del dispositivo o déjeme decir el volumen de timbre.

¿Cómo puedo hacer eso? simplemente cambie el dispositivo DEVICE?

Respuesta

6

usted tiene que utilizar en lugar de applicationMusicPlayer iPodMusicPlayer para ajustar el volumen del sistema:

#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

Nota: esto está en desuso en iOS 7 –

+1

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

17

Para responder a la pregunta de brush51:

¿Cómo puedo hacer eso? solo cambia el volumen del DISPOSITIVO?

Como 0x7fffffff sugirió:

No se puede cambiar el volumen del dispositivo mediante programación, sin embargo MPVolumeView (control de volumen) está ahí para cambiar el volumen del dispositivo, pero sólo a través de la interacción del usuario.

Así, Apple recomienda el uso de MPVolumeView, por lo que se le ocurrió esto:

Añadir volumeSlider propiedad:

@property (nonatomic, strong) UISlider *volumeSlider; 

Init MPVolumeView y añadir algún lugar a la vista (se puede ocultar, sin cuadro , o vacío debido a showsRouteButton = NO y showsVolumeSlider = NO):

MPVolumeView *volumeView = [MPVolumeView new]; 
volumeView.showsRouteButton = NO; 
volumeView.showsVolumeSlider = NO; 
[self.view addSubview:volumeView]; 

Encontrar y guardar referencia a 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; 
    } 
}]; 

acción Agregar objetivo para UIControlEventValueChanged:

[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged]; 

Y luego detectar el volumen cambiante (es decir, por los controles de volumen de hardware):

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

y también revés, puede establecer el volumen por:

self.volumeSlider.value = < some value between 0.0f and 1.0f >; 

Espero que esto ayude (y que Apple no elimina MPVolumeSlider de MPVolumeView).

+0

¿alguna vez lo has probado? ¿Te rechazaron por cambiar el volumen programáticamente? – iCaramba

+0

Esto suena como un truco – onmyway133

+0

No funciona para mí en ios 7.1 y 8. El valor del control deslizante cambia, pero el volumen del sonido del sistema no funciona. – Dvole

8

Esto es lo que he hecho:

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

Como propiedad volume en MPMusicPlayerController era Desaprobar en iOS 7.Este es solo el método que puedes hacer.

+1

Tengo curiosidad, mientras esto funciona, ¿ha sido obtenido a través de la revisión de la App Store? –

2

Aquí hay una pequeña clase de contenedor que puede configurar el volumen del sistema y también notificarle sobre cualquier cambio (pase su propio respondedor de cambios a setTarget: acción :).

Editar: si oculta el control MPVolumeView o no lo agrega como una vista secundaria, el sistema mostrará el cuadro de volumen predeterminado en el medio de la pantalla cada vez que cambie el volumen mediante programación. Si no le gusta lo que hace el sistema, la solución es establecer las coordenadas de vista fuera de la pantalla. Edité mi código a continuación un poco para reflejar esto.

@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 

A continuación, cree una instancia y usarlo:

SysVolumeControl* sysVolumeControl = [SysVolumeControl new]; 
[myView addSubview:sysVolumeControl]; 
sysVolumeControl.value = 1.0; 
[sysVolumeControl setTarget:self action:@selector(mySysVolumeResponder:)]; 
6

Esta solución (Swift) funcionó muy bien para mí: 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

Gracias por esto, me salvó unas horas o más tratando de descubrir cómo acceder de forma limpia a ese control deslizante. Tengo que decir que esto es tan descabellado en la parte de Apple: mi aplicación es solo gestos y un control deslizante no tiene cabida. Espero que no rechacen en base a esto. Dejaré una buena nota en el código. – solenoid

+1

Solo unas pocas notas: cambiar el volumen fuera de la aplicación (como el centro de control) haría que esto no funcione más. Podría ser donde lo estaba usando, pero lo puse como una var global en la aplicaciónDelegate y parece funcionar. También estaba obteniendo un valor de inicio de 0 en muchas circunstancias. volumeView.setNeedsLayout() en algún momento antes de obtener/conjunto de valores corrige ese problema. – solenoid

0

Swift 3 - Yo uso este:

func setVolumeTo(volume: Float) { 
    (MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false) 
} 
Cuestiones relacionadas