webentwicklung-frage-antwort-db.com.de

iOS 7: MPMusicPlayerController-Volume ist veraltet. Wie kann ich die Lautstärke des Geräts jetzt ändern?

MPMusicPlayerController setVolume ist seit iOS 7 veraltet

Gibt es eine andere Möglichkeit, die Lautstärke der Systemmusik zu ändern? Vorzugsweise ohne Benutzerinteraktion ..__Das wichtige Merkmal: Automatische Erhöhung der Lautstärke für jeden Wecker aus AppStore.

40

Um Ihre Frage genau zu beantworten: Ja, es gibt eine andere Möglichkeit, das Systemvolumen ohne Benutzerinteraktion zu ändern.

Bis vor kurzem war ich der Meinung, dass das programmgesteuerte Ändern von Volumes mit MPVolumeView nur mit privater API möglich ist. Ich habe jedoch gerade bestätigt, dass das Ändern des Wertes von volumeSlider und das vorgetäuschte touchUP-Ereignis des Schiebereglers funktioniert:

MPVolumeView* volumeView = [[MPVolumeView alloc] init];

//find the volumeSlider
UISlider* volumeViewSlider = nil;
for (UIView *view in [volumeView subviews]){
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
        volumeViewSlider = (UISlider*)view;
        break;
    }
}

[volumeViewSlider setValue:1.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

(Wenn der Schieberegler das touchUP-Ereignis empfängt, ruft er die _commitVolumeChange-Methode für sich selbst auf, wodurch das Systemvolumen geändert wird.)

51
ambientlight

Bis Apple diese Entscheidung widerrufen kann, gibt es zwei Mittel, die ich entdeckt habe:

  • Verwenden Sie die Volume-Eigenschaft weiter. Sie funktioniert immer noch unter iOS 7.0.2
  • Verwenden Sie AVAudioSession.outputVolume, um das Volume zu lesen, wenn Ihre App aufwacht, und zeigt eine Warnung mit einem MPVolumeView an, wenn das Volume einen vom Benutzer angegebenen Wert (oder einen höheren Wert) als angegeben hat. Zumindest weiß Ihr Benutzer, dass sein Alarm (oder was auch immer) leise abgespielt wird, und hat die Möglichkeit, die Lautstärke einzustellen. Alternativ können Sie den Lautstärkepegel auch sehr deutlich anzeigen, damit sie keine Überraschungen erfahren.
13
amergin

Mach einfach das:

let masterVolumeSlider: MPVolumeView = MPVolumeView()

if let view = masterVolumeSlider.subviews.first as? UISlider{

    view.value = 1.0

}
9
Jon Vogel

@Hurden, ich habe einen Swift-Code geschrieben, um den MPVolumeSlider zu implementieren:

for view in mpVolumeView.subviews {
  let uiview: UIView = view as UIView
  //println("\(uiview.description)")
  if uiview.description.rangesOfString("MPVolumeSlider").first != nil {
    mpVolumeSilder = (uiview as UISlider)
    currentDeviceVolume = mpVolumeSilder!.value
    return
  }
}

Die func rangeOfString-Erweiterung String ist hier zu finden Swift: Eine reine Swift-Methode zum Zurückgeben von Bereichen einer String-Instanz (Xcode 6 Beta 5)

Und mit diesem Code können Geste und mpvolumeslider zusammenarbeiten

@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
  let translation = recognizer.translationInView(self.view)
  let dx = (translation.x-lastTranslationX)
  let volumeChanged = Float(dx / mpVolumeView.frame.width)
  currentDeviceVolume = currentDeviceVolume + Float(volumeChanged)

  if currentDeviceVolume > 1 {
    currentDeviceVolume = 1
  } else if currentDeviceVolume < 0 {
    currentDeviceVolume = 0
  }

  mpVolumeSilder!.value = currentDeviceVolume

  if recognizer.state == .Changed {
    lastTranslationX = translation.x
  }
  if recognizer.state == .Ended || recognizer.state == .Began {
    lastTranslationX = 0
  }
}
4
charles.cc.hsu

Schnelle Version:

// Outlet added in Storyboard (Add UIView then set class to MPVolumeView)
@IBOutlet weak var mpVolumeView: MPVolumeView!

    // Get volume slider within MPVolumeView
    for subview in self.mpVolumeView.subviews {
        if (subview as UIView).description.rangeOfString("MPVolumeSlider") != nil {
            // Set volume
            let volumeSlider = subview as UISlider
            volumeSlider.value = 1

            // Works with or without the following line:
            // volumeSlider.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
            break
        }
    }
1
Oak

Anscheinend gibt es mit eine Möglichkeit, das Systemvolumen zu ändern, ohne etwas anzuzeigen.

Und am besten funktioniert es auf iOS 11.

So habe ich es erreicht: 

1) Erstellen Sie zwei Variablen im gewünschten ViewController 

let volumeView = MPVolumeView()
var slider: UISlider?

2) Fügen Sie den folgenden Code zu Ihrem viewDidLoad hinzu

volumeView.alpha = 0.01
self.view.addSubview(volumeView)

if let view = volumeView.subviews.first as? UISlider {
    slider = view
}

3) Ändern Sie die Lautstärke, wann immer Sie brauchen

slider?.value = 0.4
1
Markus
let masterVolumeSlider  : MPVolumeView = MPVolumeView()

        if let view             = masterVolumeSlider.subviews.first as? UISlider{

        view.value              = fVolume!

        view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)

        }
0
Vicky

Diese Lösung macht ein bisschen nervös und ich finde es ein bisschen seltsam, dass es keine offizielle API gibt, aber hier ist meine Swift-Lösung, die aus AmbientLights Post besteht

var _volumeView = MPVolumeView()
var _volumeSlider : UISlider? = nil



self.view.addSubview(_volumeView)
_volumeView.hidden = true

var i = 0
while i < _volumeView.subviews.count {
   if let _r = _volumeView.subviews[i] as? UISlider {
      _volumeSlider = _r
      break
   }
   ++i
}
0
Krtko