web-dev-qa-db-fra.com

Comment changer le volume de l'appareil sur iOS - pas le volume de la musique

Je souhaite modifier le volume de l'appareil sur iOS (iphone).

Je sais que je peux modifier le volume de la bibliothèque musicale avec les lignes ci-dessous: 

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

Mais ce n'est pas mon objectif.
Je souhaite modifier le volume du périphérique ou laissez-moi dire le volume de sonnerie .

Comment puis je faire ça? il suffit de changer lePÉRIPHÉRIQUEvolume? 

15
brush51

Pour répondre à la question de brush51:

Comment puis je faire ça? il suffit de changer le volume de l'appareil?

Comme suggéré par 0x7fffffff:

Vous ne pouvez pas modifier le volume du périphérique par programme. Cependant, MPVolumeView (curseur de volume) permet de modifier le volume du périphérique, mais uniquement par le biais d'une interaction de l'utilisateur.

Apple recommande donc d'utiliser MPVolumeView. C'est pourquoi j'ai proposé ceci:

Ajouter la propriété volumeSlider:

@property (nonatomic, strong) UISlider *volumeSlider;

Init MPVolumeView et ajouter quelque part à votre vue (peut être caché, sans cadre, ou vide à cause de showsRouteButton = NO et showsVolumeSlider = NO):

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

Recherchez et enregistrez la référence à 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;
    }
}];

Ajouter une action cible pour UIControlEventValueChanged:

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

Et puis détectez le changement de volume (c'est-à-dire à l'aide des contrôles de volume matériels):

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

et de toute autre manière, vous pouvez régler le volume en:

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

J'espère que cela vous aidera (et qu'Apple ne supprimera pas MPVolumeSlider de MPVolumeView).

17
msrdjan

Voici ce que j'ai fait:

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

Comme la propriété volume dans MPMusicPlayerController était obsolète dans iOS 7. C’est la seule méthode que vous pouvez faire.

8
Nikita Zernov

Cette solution (Swift) a très bien fonctionné pour moi: 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---

}
6
Lars335

Vous devez utiliser applicationMusicPlayer au lieu de iPodMusicPlayer pour définir le volume du système:

#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
6
Paul Slocum

Voici une petite classe wrapper qui peut définir le volume du système et également vous informer de tout changement (passez votre propre répondeur de changement à setTarget: action :).

Edit : si vous masquez le contrôle MPVolumeView ou ne l'ajoutez pas en tant que sous-vue, le système affichera le carré du volume par défaut au milieu de l'écran chaque fois que vous modifiez le volume par programme. Si vous n'aimez pas ce que le système fait, la solution consiste à définir les coordonnées de la vue en dehors de l'écran. J'ai édité mon code ci-dessous un peu pour refléter cela.

@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

Créez ensuite une instance et utilisez-la:

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

Créer à la volée MPVolumeView pour obtenir le curseur et régler le volume ne fonctionne plus dans iOS 11.4 J'ai résolu le problème en ajoutant un nouveau MPVolumeView à ma vue UIViewController, sinon le volume n'était pas défini. Lorsque je l'ai ajouté au contrôleur, je dois également définir la position d'affichage du volume en dehors de l'écran. 

Le code est dans 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)
}
1
Northern Captain

Swift 3 - J'utilise ceci:

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