wake-up-neo.com

So ändern Sie die Lautstärke des Geräts unter iOS - nicht die Musiklautstärke

Ich möchte die Gerätelautstärke unter iOS (iPhone) ändern.

Ich weiß, dass ich die Lautstärke der Musikbibliothek mit folgenden Zeilen ändern kann: 

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

Aber das ist nicht mein Ziel.
Ich möchte die Lautstärke der Geräte ändern oder lass mich die Lautstärke der Klingel sagen.

Wie kann ich das machen? einfach dasDEVICEvolume ändern? 

15
brush51

Um die Frage von brush51 zu beantworten:

Wie kann ich das machen? einfach die GERÄTE-Lautstärke ändern?

Wie 0x7fffffff vorschlug:

Sie können die Gerätelautstärke nicht programmgesteuert ändern. MPVolumeView (Volume-Schieberegler) dient jedoch zur Änderung der Gerätelautstärke, jedoch nur durch Benutzerinteraktion.

Daher empfiehlt Apple die Verwendung von MPVolumeView, daher habe ich Folgendes entwickelt:

Fügen Sie die volumeSlider-Eigenschaft hinzu:

@property (nonatomic, strong) UISlider *volumeSlider;

Init MPVolumeView und füge irgendwo zu deiner Ansicht hinzu (kann ausgeblendet werden, ohne Rahmen oder wegen showsRouteButton = NO und showsVolumeSlider = NO leer):

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

Verweis auf UISlider suchen und speichern:

__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;
    }
}];

Zielaktion für UIControlEventValueChanged hinzufügen:

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

Und dann die Lautstärkeänderung feststellen (d. H. Über die Hardware-Lautstärkeregler):

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

und auch anders herum können Sie die Lautstärke einstellen durch:

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

Hoffe das hilft (und dass Apple MPVolumeSlider nicht aus MPVolumeView entfernt).

17
msrdjan

Folgendes habe ich getan:

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

Die Eigenschaft volume in MPMusicPlayerController war in iOS 7 veraltet. Dies ist nur die Methode, mit der Sie das tun können.

8
Nikita Zernov

Diese (schnelle) Lösung funktionierte für mich großartig: http://weimenglee.blogspot.com/2015/07/ios-tip-programmatic-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

Sie müssen applicationMusicPlayer anstelle von iPodMusicPlayer verwenden, um die Systemlautstärke einzustellen:

#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

Hier ist eine kleine Wrapper-Klasse, die das System-Volume festlegen und Sie auch über alle Änderungen benachrichtigen kann (übergeben Sie Ihren eigenen Änderungsantworten an setTarget: action :).

Edit : Wenn Sie das MPVolumeView-Steuerelement ausblenden oder nicht als Unteransicht hinzufügen, zeigt das System das voreingestellte Volumenquadrat in der Mitte des Bildschirms an, wenn Sie das Volume programmgesteuert ändern. Wenn Ihnen das System nicht gefällt, können Sie Ansichtskoordinaten außerhalb des Bildschirms festlegen. Ich habe meinen Code etwas überarbeitet, um dies zu berücksichtigen.

@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

Dann erstellen Sie eine Instanz und verwenden Sie sie:

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

Das Erstellen von MPVolumeView im Handumdrehen, um den Schieberegler zu erhalten und die Lautstärke einzustellen, funktioniert in iOS 11.4 nicht mehr. Ich habe das Problem gelöst, indem ich meiner UIViewController-Ansicht neues MPVolumeView hinzugefügt habe. Andernfalls wurde die Lautstärke nicht festgelegt. Da ich es zum Controller hinzugefügt habe, muss ich auch die Position der Lautstärkeansicht außerhalb des Bildschirms einstellen. 

Der Code ist in 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

Swift 3 - ich benutze das:

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

Die App sollte die globalen Geräteeinstellungen nicht ändern und Sie sollten dies nicht tun. Der Benutzer kann dies mit den Standardfunktionen von iOS tun. Wenn Sie stattdessen einen Sound/ein Video abspielen, verwenden Sie das volume des Players:

var player: AVPlayer!
...
player.volume = 0.5 // 50% level
0