Обнаружение кнопки громкости iPhone вверх?
-
12-12-2019 - |
Вопрос
Есть ли уведомление о том, что я могу слушать, что скажет мне, когда громкость iPhone включен Up ?
Я знаю о AVSystemController_SystemVolumeDidChangeNotification
, но важно, чтобы уведомление было срабатывает только тогда, когда объем был включен, не вверх или вниз.
Во-вторых, как я могу скрыть прозрачный вид, который появляется, когда нажата кнопка громкости вверх, показывая громкость системы?<Сильная> камера + реализовала это.
Решение
Нет документированного способа к этому, но вы можете использовать этот обходной путь.Регистрация для уведомления AVSystemController_SystemVolumeDidChangeNotification
и добавить MPVolumeView
, который предотвратит представление громкости системы.
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, 0, 10, 0)];
[volumeView sizeToFit];
[self.view addSubview:volumeView];
.
И не забудьте запустить аудиосессию
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(true);
.
В этом случае генеракодицетагкод скрыт от пользователя.
Как для проверки, если нажата громкость или вниз, просто возьмите то громкость текущего приложения
float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume];
.
и сравните его с новым объемом после нажатия кнопки в обратном вызове уведомлений
Если вы не хотите делать это самостоятельно, в Github есть класс Drop-in в Github
Другие советы
Если вы хотите событие, которое вы можете зарегистрировать слушатель в свойстве «ВыводVolume»:
- (void)viewWillAppear:(BOOL)animated {
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
[audioSession setActive:YES error:nil];
[audioSession addObserver:self
forKeyPath:@"outputVolume"
options:0
context:nil];
}
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqual:@"outputVolume"]) {
NSLog(@"volume changed!");
}
}
. Я решил эту проблему, добавив собственную цель / действие для UISLIDER, помещенного внутри GeneracodicCode.Так что можно поймать события изменения громкости и определить, какую кнопку было нажата.Вот github repo с реализацией этого подхода. Работает нормально с iOS 7 и выше, никаких предупреждений амортизации и отсутствия отказа от Apple.
Для того, чтобы отличить действие громкости: вместо (в охране наблюдателя)
.
temp != 0.5
<Сильное> Использование только для громкости вверх
.
temp > 0.5
и определяет только громкость вниз:
.
temp < 0.5
Это решение ниже будет печать, если нажата либо громкость, либо вниз.
.import AVFoundation
import MediaPlayer
override func viewDidLoad() {
super.viewDidLoad()
let volumeView = MPVolumeView(frame: CGRect.zero)
for subview in volumeView.subviews {
if let button = subview as? UIButton {
button.setImage(nil, for: .normal)
button.isEnabled = false
button.sizeToFit()
}
}
UIApplication.shared.windows.first?.addSubview(volumeView)
UIApplication.shared.windows.first?.sendSubview(toBack: volumeView)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil)
do { try AVAudioSession.sharedInstance().setActive(true) }
catch { debugPrint("\(error)") }
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume")
do { try AVAudioSession.sharedInstance().setActive(false) }
catch { debugPrint("\(error)") }
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let key = keyPath else { return }
switch key {
case "outputVolume":
guard let dict = change, let temp = dict[NSKeyValueChangeKey.newKey] as? Float, temp != 0.5 else { return }
let systemSlider = MPVolumeView().subviews.first { (aView) -> Bool in
return NSStringFromClass(aView.classForCoder) == "MPVolumeSlider" ? true : false
} as? UISlider
systemSlider?.setValue(0.5, animated: false)
guard systemSlider != nil else { return }
debugPrint("Either volume button tapped.")
default:
break
}
}