Я пишу очень простое приложение, которое воспроизводит звук при нажатии кнопки. Поскольку эта кнопка не имеет большого смысла, когда устройство настроено на молчание, я хочу отключить его, когда громкость звука устройства равна нулю. (И впоследствии его можно повторно использовать, когда громкость снова закручивается.)
Я ищу рабочий (и безопасный для 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, документации для разработчиков и на многочисленных сайтах в сетях), я действительно получаю обратный вызов при изменении аудиодорожки ( путем подключения/выключения гарнитуры или стыковки устройства).
Пользователь с именем Doug открыл поток под названием изменил объем iPhone на тома уже max, где он утверждал, что он успешно использует этот способ (если только объем не изменится, потому что он уже установлен на максимум). Тем не менее, это не работает для меня.
Еще один способ, которым я попытался, - зарегистрироваться на NSNotificationCenter
, как это.
// sharedAVSystemController
AudioSessionInitialize(NULL, NULL, NULL, NULL);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
Это должно уведомить мой метод volumeChanged
о любых изменениях SystemVolume
, но на самом деле это не так.
Так как распространенное мнение говорит мне, что если кто-то слишком много работает, чтобы достичь чего-то с помощью Cocoa, то кто-то делает что-то принципиально неправильное. Я ожидаю чего-то пропустить. Трудно поверить, что нет простого способа получить текущий уровень громкости, но я не смог найти его, используя документацию Apple, образец кода, Google, форумы Apple Developer или просмотрев видеоролики WWDC 2010.