¿Cómo obtener el nivel de volumen de audio y las notificaciones de cambio de volumen en iOS?

Estoy escribiendo una aplicación muy simple que reproduce un sonido al presionar un botón. Dado que ese botón no tiene mucho sentido cuando el dispositivo está configurado en silencio, quiero desactivarlo cuando el volumen de audio del dispositivo es cero. (Y posteriormente, vuelva a habilitarlo cuando el volumen vuelva a subir).

Estoy buscando una forma de trabajo (y segura de AppStore) paradetectar la configuración de volumen actual y recibir una notificación / devolución de llamada cuando cambia el nivel de volumen. yono quiero alterar el volumen ajuste.

Todo esto se implementa en miViewController donde se usa dicho botón. He probado esto con un iPhone 4 con iOS 4.0.1 y 4.0.2, así como con un iPhone 3G con 4.0.1. Construido con iOS SDK 4.0.2 con llvm 1.5. (El uso de gcc o llvm-gcc no mejora nada). No hay problemas durante la implementación de la compilación de ninguna manera, ni errores ni advertencias. El analizador estático también es feliz.

Esto es lo que he intentado hasta ahora, todo sin ningún éxito.

Siguiendo la documentación de los servicios de audio de Apple, debo registrar unAudioSessionAddPropertyListener parakAudioSessionProperty_CurrentHardwareOutputVolume que debería funcionar así:

// Registering for Volume Change notifications
AudioSessionInitialize(NULL, NULL, NULL, NULL);
returnvalue = AudioSessionAddPropertyListener (

kAudioSessionProperty_CurrentHardwareOutputVolume ,
      audioVolumeChangeListenerCallback,
      self
);

returnvalue es0, lo que significa que el registro de la devolución de llamada funcionó.

Lamentablemente, nunca recibo una devolución de llamada a mi funciónaudioVolumeChangeListenerCallback cuando presiono los botones de volumen en mi dispositivo, el auricular hace clic o volteo el interruptor de silencio del timbre.

Cuando se usa exactamente el mismo código para registrarsekAudioSessionProperty_AudioRouteChange (que se utiliza como un proyecto de muestra análogo en videos de la WWDC, documentación del desarrollador y en numerosos sitios en las interwebs)hacer recibir una devolución de llamada al cambiar la ruta de audio (conectando / desconectando unos auriculares o conectando el dispositivo).

Un usuario llamadoDoug abrió un hilo tituladoEl volumen del iPhone cambió el evento para el volumen ya máximo donde afirmó que está usando con éxito de esta manera (a menos que el volumen no cambie realmente porque ya está configurado al máximo). Aún así, no funciona para mí.

Otra forma en que he intentado es registrarme enNSNotificationCenter Me gusta esto.

// sharedAVSystemController 
AudioSessionInitialize(NULL, NULL, NULL, NULL);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
                                         selector:@selector(volumeChanged:) 
                                             name:@"AVSystemController_SystemVolumeDidChangeNotification" 
                                           object:nil];

Esto debería notificar mi métodovolumeChanged de cualquierSystemVolume cambia pero en realidad no lo hace.

Como la creencia común me dice que si uno está trabajando demasiado duro para lograr algo con Cocoa, está haciendo algo fundamentalmente incorrecto, espero perder algo aquí. Es difícil creer que hayno de manera simple aobtener el nivel de volumen actual, sin embargo, no he podido encontrar uno utilizando la documentación de Apple, el código de muestra, Google, los foros de desarrolladores de Apple o viendo videos de WWDC 2010.

Respuestas a la pregunta(8)

Su respuesta a la pregunta