2009-05-07 12 views
17

Estoy desarrollando una aplicación. En eso quiero detectar a través de la codificación que "¿iPhone está en modo silencioso o no?". Lo estoy desarrollando usando cacao con Objective-C.Cómo detectar iphone está en modo silencioso

Si alguien sabe, amablemente responda.

Respuesta

4

Es posible gracias a las pruebas para una ruta de audio NULL usando AudioToolbox:

UInt32 routeSize = sizeof (CFStringRef); 
CFStringRef route; 

AudioSessionGetProperty (
         kAudioSessionProperty_AudioRoute, 
         &routeSize, 
         &route 
         ); 

if (route == NULL) { 
    NSLog(@"Silent switch is on"); 
} 

Si la ruta es NULL entonces no hay salidas de audio disponibles. Si se trata de "Auriculares" o "Auriculares", el interruptor de timbre silencioso aún podría estar encendido. Sin embargo, nunca estará activado cuando esté configurado en "Altavoz".

usted está probablemente mejor prueba de esto en su oyente propiedad cambio de ruta de audio, que se establece a continuación:

AudioSessionAddPropertyListener (
           kAudioSessionProperty_AudioRouteChange, 
           audioRouteChangeListenerCallback, 
           self 
           ); 

Nota: Si estás haciendo algo cobarde como rutas de audio de primer orden, entonces esta respuesta puede no aplicar.

Configurar y desmontar una sesión de audio en su totalidad probablemente esté fuera del alcance de esta respuesta.

+0

Muchas gracias coob. Lo verificaré y le haré saber. – Jyotsna

+0

¿Funcionó bien para usted? –

+0

@Jyotsna es este código funcionó para usted? – sathis

3

Para completar, construyendo this link de Dan Bon, implemento el siguiente método para resolver este problema en mis aplicaciones. Una cosa a tener en cuenta es que primero el código busca el simulador de iPhone: la ejecución del código a continuación bloqueará el simulador. Alguien sabe por qué?

-(BOOL)silenced { 
    #if TARGET_IPHONE_SIMULATOR 
     // return NO in simulator. Code causes crashes for some reason. 
    return NO; 
    #endif 

    CFStringRef state; 
    UInt32 propertySize = sizeof(CFStringRef); 
    AudioSessionInitialize(NULL, NULL, NULL, NULL); 
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); 
    if(CFStringGetLength(state) > 0) 
     return NO; 
    else 
     return YES; 

} 

La declaración de este derecho en el controlador de vista, usted simplemente comprueba

if ([self silenced]) { 
    NSLog(@"silenced"); 

else { 
    NSLog(@"not silenced"); 
} 

O, obviamente, se puede declarar en una especie de clase de ayuda. Una solución más elegante podría ser una adición de categoría en UIApplication o alguna otra clase ...

+0

obsoleto en ios 7 –

+0

AudioSessionGetProperty está en desuso ahora. Hay [AVAudioSession sharedInstance] .currentRoute para obtener currentRoute, pero incluso utilizando AVAudioSessionCategoryAmbient no permiten obtener el estado del interruptor de silencio de hardware. – slamor

+0

No funciona. cada vez que va en otra parte ... –

19

La razón por la cual el código de Pirripli no funciona es porque el simulador no admite la prueba y el código no verifica si hay errores. código corregido se vería así:

CFStringRef state = nil; 
UInt32 propertySize = sizeof(CFStringRef); 
AudioSessionInitialize(NULL, NULL, NULL, NULL); 
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); 

if (status == kAudioSessionNoError) 
{ 
    return (CFStringGetLength(state) == 0); // YES = silent 
} 
return NO; 
+2

no funciona en el iPhone 4 iOS 5 :(.. state = "speaker", creo que – Mazyod

+0

Correcto, no funciona en iOS 5, resulta que Apple nunca tuvo la intención para que se use de esta manera. Mi aplicación ya no intenta averiguar el estado del interruptor de silencio. La aplicación emite audio y si el usuario tiene el interruptor de silencio activado, entonces el audio no suena. La aplicación también tiene preferencia por la vibración y si el usuario lo tiene encendido, entonces la aplicación vibra además del audio. Por lo tanto, el usuario tiene el control completo y la aplicación no necesita saber el estado del interruptor. – Neil

+0

@Neil, dices que tu aplicación "ya no intenta" para averiguar el estado del interruptor de silencio "pero luego" si el usuario tiene el interruptor de silencio encendido, entonces el audio no suena ". ¿No significa eso que está monitoreando el interruptor de silencio? ¿Qué categoría (o categorías) son usted está usando? –

1

Puede utilizar audio propiedad de ruta como se sugiere en las respuestas anteriores, pero tenga en cuenta que: - sólo funciona si la categoría de audio es AmbientSound - No debe inicializar audio Sesión más de una vez en su aplicación (consulte la Guía de programación de la sesión de audio) - Debe liberar esos CFStringRef para evitar pérdidas de mem

En caso de que la categoría de audio actual no sea AmbientSound, puede pensar en cambiarla temporalmente, realizar el verifique la propiedad Ruta de audio y luego restaure la Categoría de audio original.

Tenga en cuenta que al cambiar la categoría de audio se restaurará la ruta de audio predeterminada para esa categoría, dada la configuración actual del hardware (es decir, si hay auriculares conectados o no, etc.).

Cuestiones relacionadas