2012-04-23 8 views
14

Voglio cambiare il volume del dispositivo su iOS (iphone).Come cambiare il volume del dispositivo su iOS - non il volume della musica

so che posso cambiare il volume della libreria musicale con questo righe sotto:

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

Ma quello non è il mio scopo.
Desidero modificare il volume del dispositivo oppure indicare il volume della suoneria .

Come posso farlo? basta cambiare il volume DEVICE?

risposta

6

devi usare applicationMusicPlayer invece di iPodMusicPlayer per impostare il volume 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: questo è obsoleto in iOS 7 –

+1

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

17

Per rispondere alla domanda di brush51:

Come posso fare questo? basta cambiare il volume del DISPOSITIVO?

Come 0x7fffffff suggerito:

Non è possibile modificare il volume del dispositivo programatically, tuttavia MPVolumeView (cursore del volume) è lì per cambiare volume del dispositivo, ma solo attraverso l'interazione dell'utente.

Quindi, Apple consiglia di utilizzare MPVolumeView, così mi si avvicinò con questo:

Aggiungi volumeSlider proprietà:

@property (nonatomic, strong) UISlider *volumeSlider; 

Init MPVolumeView e aggiungere qualche parte per la visualizzazione (può essere nascosto, senza cornice oppure vuoto a causa di showsRouteButton = NO e):

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

Trovare e salvare riferimento 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; 
    } 
}]; 

Aggiungi azione obiettivo per UIControlEventValueChanged:

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

E poi di rilevare il volume cambia (vale a dire dai controlli di volume hardware):

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

e anche viceversa, è possibile impostare il volume da:

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

Spero che questo aiuti (e che Apple non rimuove MPVolumeSlider da MPVolumeView).

+0

hai mai provato? Sei stato rifiutato per aver cambiato il volume programmaticamente? – iCaramba

+0

Questo suona come un trucco – onmyway133

+0

Non funziona per me su iOS 7.1 e 8. Il valore del cursore cambia, ma il volume del suono del sistema no. – Dvole

8

Ecco che cosa ho fatto:

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

Come proprietà volume in MPMusicPlayerController era deprecate in iOS 7.Questo è solo il metodo che puoi fare.

+1

Sono curioso, mentre questo funziona, ha ottenuto attraverso la recensione App Store? –

2

Ecco una piccola classe wrapper in grado di impostare il volume di sistema e anche di notificare eventuali modifiche (passare il proprio risponditore di modifiche a setTarget: azione :).

Modifica: se si nasconde il controllo MPVolumeView o non lo si aggiunge come sottoview, il sistema mostrerà il quadrato del volume predefinito nel mezzo dello schermo ogni volta che si modifica il volume a livello di programmazione. Se non ti piace ciò che fa il sistema, la soluzione è impostare le coordinate di visualizzazione al di fuori dello schermo. Ho modificato il mio codice sotto un po 'per riflettere questo.

@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 

Quindi creare un'istanza e usarlo:

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

Questa soluzione (Swift) ha lavorato molto per me: 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

Grazie per questo - mi ha salvato qualche ora o più cercando di capire come accedere in modo pulito a quel cursore. Devo dire che questo è così ossuto da parte di Apple - la mia app è tutta gestualità, e un cursore non ha spazio. Spero che non rifiutino in base a questo. Lascerò una bella nota nel codice. – solenoid

+1

Solo alcune note: la modifica del volume all'esterno dell'app (come il centro di controllo) farebbe in modo che non funzioni più. Potrebbe essere dove lo stavo usando, ma l'ho messo come una variabile globale in appDelegate e sembra funzionare. Avevo anche un valore iniziale di 0 in molte circostanze. volumeView.setNeedsLayout() ad un certo punto prima di get/set di valori risolve quel problema. – solenoid

0

Swift 3 - Io uso questa:

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