Слушатель свойства аудио сеанса автоматически деактивируется в UIImagePickerController? - PullRequest
5 голосов
/ 21 ноября 2010

Я разрабатываю приложение камеры для фотосъемки при нажатии кнопки громкости.

Я использовал AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume, audioVolumeChangeListenerCallback, self);, чтобы успешно получать уведомления при нажатии кнопки громкости до запуска моей камеры.Однако после того, как я запустил камеру, это свойство слушателя больше не работает.Это автоматически отключается или что-то в этом роде?

Я пытался реализовать пользовательский UIImagePickerController для включения прослушивателя свойства аудио сеанса внутри ImagePickerController, но без надежды.Благодарен, если кто-то может поделиться вашим мнением.Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Мне жаль говорить, что это то, что не поддерживается в IOS4.Если вам удалось реализовать это успешно, приложение будет отклонено Apple.

Однако на WWDC 2011 было объявлено, что это полностью поддерживается в IO5 и будет поведением по умолчанию при использовании UIImagePickerController в любом приложении.

Надеюсь, это поможет.

1 голос
/ 01 августа 2011

Даже в приложении камеры по умолчанию на iphone увеличение / уменьшение громкости не поддерживается.Может быть, они блокируют ввод с этих кнопок, когда камера включена.То, что они не блокируют, является тихим выключателем.Я добавил это уведомление, и мой обратный вызов был вызван даже при включенной камере:

AudioSessionInitialize(nil, nil, nil, nil);
AudioSessionSetActive(true);
AudioSessionAddPropertyListener(
                                kAudioSessionProperty_AudioRouteChange,
                                applicationAudioRouteDidChange,
                                self);

Проблема, которую необходимо решить, заключается в том, что метод applicationAudioRouteDidChange также будет вызываться, если кто-то вставит наушники.Вы можете проверить это, как сказано в AudioSessionProgrammingGuide :

Когда система вызывает обратный вызов с изменением маршрута, она предоставляет информацию, необходимую для выяснения, какое действие предпринять.Основывайте свой обратный вызов на прототипе AudioSessionPropertyListener из служб аудиосеансов, как показано здесь:

void MyPropertyListener (void * inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void * inData);

Для события изменения маршрута система отправляет kAudioSessionProperty_AudioRouteChange в параметре inID.

Параметр inData, отправляемый вашему обратному вызову, содержит объект CFDictionaryRef, который описывает:

Почемумаршрут изменился. То, что предыдущий маршрут был

Я сделал это, и он делает снимок, когда тихий переключатель переключается на мммм:

void applicationAudioRouteDidChange(void *inClientData,
                                AudioSessionPropertyID inID,
                                UInt32 inDataSize, const void *inData)
{


    if ([[(NSDictionary*)inData objectForKey:@"OutputDeviceDidChange_Reason"] intValue] == 5) {
        [((RootViewController*)inClientData).picker takePicture];
    }

    // Do something like reset the system
}

Как упомянул Том, функциональность, которую вы пытаетесьреализовать будет частью iOS 5.

...