2015-01-28 3 views
20

Какой лучший/самый чистый способ захвата кнопки увеличения и уменьшения громкости на iOS 8?Самый чистый способ захвата громкости вверх/вниз нажмите на iOS 8

В идеале я хотел бы зафиксировать нажатие клавиши, а также предотвратить изменение громкости системы (или, по крайней мере, предотвратить показ HUD для изменения громкости).


Есть некоторые старые ответы собирается вокруг, которые используют устаревшие методы и, кажется, не работают вообще на прошивке 8. Это iOS 8 specific one не работает.

Этот класс RBVolumeButtons с открытым кодом, похоже, не работает на iOS 8.

+0

Является ли это для джейлбрейк или корпоративное приложение? В противном случае Apple не сможет рассмотреть этот вопрос. –

+0

Нет, это обычный магазин приложений. Я прочитал, что Apple теперь одобряет захват кнопок громкости при определенных обстоятельствах (например, используя их в качестве затвора камеры, см. [Камера +] (http://www.theverge.com/apple/2011/11/17/2569563/ камера-приложение-iphone обновляемая-объемно-кнопка-затвор)). –

+1

См. Мой ответ на дублированный вопрос здесь: http://stackoverflow.com/a/37360733/893774 Я считаю, что JPSVolumeButtonHandler является самым чистым способом прямо сейчас, в частности с недавнего исправления 1.0.1. – marco

ответ

1

О, хорошо, см. Ссылки на услуги сеанса аудиосвязи для получения дополнительной информации. Вам необходимо запустить аудиозапись с помощью AudioSessionInitialize, а затем активировать ее с помощью AudioSessionSetActive, прослушать изменения в томе с помощью AudioSessionAddPropertyListener и передать обратный вызов с типом AudioSessionPropertyListener.

Этот веб-сайт имеет хорошую запись до: http://fredandrandall.com/blog/2011/11/18/taking-control-of-the-volume-buttons-on-ios-like-camera/

+1

Извините, Ive только что видел, что это github, вы ссылаетесь на –

+0

Да, поскольку я говорил, что этот подход не работает на iOS 8 (но Camera + продолжает использовать эту функцию, работающую на iOS 8). –

9

Сначала добавьте AVFoundation и MediaPlayerFramework, а затем вы можете использовать ниже код для обнаружения кнопки вверх/вниз нажмите,

-(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"]) {   
     float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume]; 
     NSLog(@"volume changed! %f",volumeLevel); 
    } 
} 
+5

Хорошее решение, но имейте в виду, что он не обнаружит кнопку «громкость вверх», если громкость уже находится в макс (или «вниз», если ее уже отключено – Eliktz

+2

, просто интересно, не против этого, что касается условий Apple , как упоминалось здесь http://stackoverflow.com/questions/29923664/is-it-possible-to-disable-volume-buttons-in-ios-apps? – daisura99

+0

Даже я хотел бы знать то же самое и можно ли программным образом изменить громкость? (чтобы уровень громкости оставался на исходном уровне –

8

Для Swift вы можете использовать следующий код в своем классеКонтроллер:

let volumeView = MPVolumeView(frame: CGRectMake(-CGFloat.max, 0.0, 0.0, 0.0)) 
self.view.addSubview(volumeView) 
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(volumeChanged(_:)), name: "AVSystemController_SystemVolumeDidChangeNotification", object: nil) 

Затем добавить эту функцию

func volumeChanged(notification: NSNotification) { 

    if let userInfo = notification.userInfo { 
     if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String { 
      if volumeChangeType == "ExplicitVolumeChange" { 
       // your code goes here 
      } 
     } 
    } 
} 

Этот код обнаружить явное действие изменения объема пользователя, как если бы вы не проверяли явное действие, эта функция будет автоматически вызываются периодически.

Этот код не препятствует изменению объема системы

+1

, вы знали бы, как предотвратить отображение системы громкости? –

5

для скор 3: (не забудьте добавить: импорт MediaPlayer ..)

override func viewDidLoad() { 
     super.viewDidLoad() 

     let volumeView = MPVolumeView(frame: CGRect(x: 0, y: 40, width: 300, height: 30)) 
     self.view.addSubview(volumeView) 
//  volumeView.backgroundColor = UIColor.red 
     NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(notification:)), 
               name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), 
               object: nil) 
    } 


    func volumeChanged(notification: NSNotification) { 

     if let userInfo = notification.userInfo { 
      if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String { 
       if volumeChangeType == "ExplicitVolumeChange" { 
        // your code goes here 
       } 
      } 
     } 
    } 

....

+0

Это работа для меня! –

Смежные вопросы