2012-12-10 6 views
2

Кажется, что событие AVSystemController_SystemVolumeDidChangeNotification на iPhone 5 запускается каждый раз при запуске AVCaptureSession.AVSystemController_SystemVolumeDidChangeNotification на iPhone 5

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil]; 

Кто-нибудь знает, как это исправить? Я использую этот Observer для съемки с помощью кнопок регулировки громкости (я знаю, что это частный API, но это та же функция, что и приложение по умолчанию для камеры, Apple обычно закрывает глаза ...), но только на iPhone 5 изображение снимается при каждом запуске камеры.

+0

Вы до сих пор с этой проблемой? Я хотел бы использовать 'AVSystemController_SystemVolumeDidChangeNotification', но у меня нет iPhone 5 для тестирования. –

+0

Да, к сожалению, я попытался исправить эту проблему на iPhone5, но, похоже, это очень сложно сделать :( – flip79

+0

Спасибо. –

ответ

0

Извините, я не мог заставить его работать разумно. Я уверен, что есть веская причина, по которой Apple реализовала такие вещи на iPhone 5, но это проклятая неприятность.

Единственный способ, которым я нашел вокруг него была не использовать его, используйте аудио сессионного метод свойства слушателя вместо:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //... 
    AudioSessionInitialize(nil, nil, nil, nil); 
    AudioSessionSetActive(YES); 

    AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume, volumeListenerCallbackIPhone, (__bridge void *)(self)); 
    //... 
} 

А потом в обратном вызове:

- (void)volumeChanged:(NSNotification *)notification 
{ 
    NSLog(@"volumeChanged"); 
    // ... 
} 

... и затем отфильтруйте событие дальше на основе контекста.

Кен

+1

AudioSessionAddPropertyListener устарел в iOS 7.0, хотя мне не удалось найти альтернативы. – yosei

4

Используйте это:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(volumeChanged:) 
              name:@"AVSystemController_SystemVolumeDidChangeNotification" 
              object:nil]; 

И затем:

- (void)volumeChanged:(NSNotification*)notification 
{ 
    if([[notification.userInfo objectForKey:@"AVSystemController_AudioVolumeChangeReasonNotificationParameter"] isEqualToString:@"ExplicitVolumeChange"]) 
    { 
     float volume = [[[notification userInfo] 
         objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] 
         floatValue]; 
    } 
} 
Смежные вопросы