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?
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).
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.
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---
}
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
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:)];
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)
}
Swift 3 - ich benutze das:
func setVolumeTo(volume: Float) {
(MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false)
}
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