Я пишу очень простое приложение, которое воспроизводит звук при нажатии кнопки.Поскольку эта кнопка не имеет большого смысла, когда устройство настроено на беззвучный режим, я хочу отключить ее, когда громкость звука устройства равна нулю.(И затем снова включите его, когда громкость снова включится.)
Я ищу рабочий (и безопасный для AppStore) способ определить текущую настройку громкости и получить уведомление / обратный вызов, когдауровень громкости меняется.Я не хочу изменять настройку громкости .
Все это реализовано в моем ViewController
, где используется указанная кнопка.Я проверил это на iPhone 4 под управлением iOS 4.0.1 и 4.0.2, а также на iPhone 3G под управлением 4.0.1.Построен с iOS SDK 4.0.2 с llvm 1.5.(Использование gcc или llvm-gcc ничего не улучшает.) При реализации сборки нет проблем, ни ошибок, ни предупреждений.Статический анализатор тоже доволен.
Вот то, что я пробовал до сих пор, но все безуспешно.
Следуя документации Apple по аудио сервисам, я должен зарегистрировать AudioSessionAddPropertyListener
для kAudioSessionProperty_CurrentHardwareOutputVolume
который должен работать так:
// Registering for Volume Change notifications
AudioSessionInitialize(NULL, NULL, NULL, NULL);
returnvalue = AudioSessionAddPropertyListener (
kAudioSessionProperty_CurrentHardwareOutputVolume ,
audioVolumeChangeListenerCallback,
self
);
returnvalue
равен 0
, что означает, что регистрация обратного вызова сработала.
К сожалению, я никогда не получаю обратный вызов своей функции audioVolumeChangeListenerCallback
когда я нажимаю кнопки регулировки громкости на моем устройстве, щелкаю гарнитуру или переключаю переключатель бесшумного звонка.
При использовании точно такого же кода для регистрации на kAudioSessionProperty_AudioRouteChange
(который используется в качестве аналогичного примера проекта в WWDCвидео, документация для разработчиков и на многочисленных сайтах в сети Интернет) Я на самом деле делаю получаю обратный вызов при изменении аудио-маршрута (подключая / вынимая гарнитуру или подключая устройство).
Aпользователь с именем Дуг открыл поток с названием Событие изменения громкости iPhone для объема, уже максимального , где он заявил, что успешно использует этот способ (если тольковремя действительно не изменится, потому что оно уже установлено на максимум).Тем не менее, это не работает для меня.
Другой способ, который я пробовал, это зарегистрироваться на NSNotificationCenter
, как это.
// sharedAVSystemController
AudioSessionInitialize(NULL, NULL, NULL, NULL);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
Это должно уведомить мой метод volumeChanged
о любомSystemVolume
меняется, но на самом деле это не так.
Так как общее убеждение говорит мне, что если кто-то слишком усердно работает, чтобы достичь чего-то с Какао, он делает что-то в корне неправильно, я ожидаю что-то здесь упустить,Трудно поверить, что нет простого способа до получить текущий уровень громкости, но я не смог найти его, используя документацию Apple, пример кода, Google, Apple DeveloperФорумы или просмотр видео WWDC 2010.