2012-04-25 13 views
14

Quiero reproducir un sonido incluso en modo silencioso en iPhone.Cómo reproducir un sonido con AVAudioPlayer en modo silencioso en iPhone

¿Se puede hacer mediante el uso de AVAudioPlayer (Sin utilizar AVAudioSession)

(para iOS 3.0+)

Gracias de antemano.

+4

Si el dispositivo está en modo silencioso, no reproducir sonido. ¡El usuario ha pedido silencio explícitamente! –

+0

¿Por qué sin AVAudioSession? –

+2

@JonathanGrynspan - eso tiene sentido cuando el usuario _solicita_ que pidieron silencio, pero si crea aplicaciones de naturaleza AV se verá inundado con este tipo de revisión: "AUDIO NO FUNCIONA ★ ☆☆☆☆" –

Respuesta

27

En realidad, puede hacer esto. Se controla a través de la Sesión de audio y no tiene nada que ver con AVAudioPlayer. ¿Por qué no quieres usar AudioSession? Juegan bien juntos ...

En su aplicación, debe inicializar la Sesión de audio, y luego también puede indicarle qué tipo de audio tiene la intención de reproducir. Si usted es un reproductor de música, entonces tiene sentido que el usuario quiera escuchar el audio incluso con el interruptor de anillo/silencio habilitado.

AudioSessionInitialize (NULL, NULL, NULL, NULL); 
    AudioSessionSetActive(true); 

    // Allow playback even if Ring/Silent switch is on mute 
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
          sizeof(sessionCategory),&sessionCategory); 

Tengo una aplicación que hago esto mismo, y utilizar AVAudioPlayer para reproducir audio, y con el/interruptor de silencio anillo activado, puedo escuchar el audio.

ACTUALIZACIÓN (11/6/2013)

En la aplicación que se ha mencionado anteriormente, donde solía el código anterior con éxito, tengo (durante algún tiempo) estado utilizando el código siguiente en su lugar para lograr el mismo resultado:

 
     AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
     NSError *error = nil; 
     BOOL result = NO; 
     if ([audioSession respondsToSelector:@selector(setActive:withOptions:error:)]) { 
      result = [audioSession setActive:YES withOptions:0 error:&error]; // iOS6+ 
     } else { 
      [audioSession setActive:YES withFlags:0 error:&error]; // iOS5 and below 
     } 
     if (!result && error) { 
      // deal with the error 
     } 

     error = nil; 
     result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error]; 

     if (!result && error) { 
      // deal with the error 
     } 

Pensé en publicar esto como una alternativa, a la luz del comentario más reciente a esta respuesta. :-)

+0

Gracias por su respuesta, funcionó muy bien :) – Nima

+0

Me alegro de escucharlo. :-) –

+0

Solía ​​usar este método, pero ahora parece que ya no funciona. ¿Alguien más ha notado esto? –

22

MarkGranoff's solution es correcto. Sin embargo, si prefiere hacerlo en Obj-c en lugar de C, también funciona lo siguiente:

NSError *error = nil; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]; 
    [[AVAudioSession sharedInstance] setActive:YES error:&error]; 
+0

Gracias wL_.Prefiero el código Obj-C para lograr esto :) Funciona perfectamente – iOSAppDev

+0

Eliminar la comprobación de errores en el código no lo hace Obj-C, tu ans es el mismo que el original ans de MarkGranoff – Thiru

+0

@Thiru esta respuesta es irrelevante ahora. Pero fue publicado antes de la edición de Marcos. –

3

Las respuestas anteriores son correctas. A continuación está la versión Swift.

do { 
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    //print("AVAudioSession Category Playback OK") 
    do { 
     try AVAudioSession.sharedInstance().setActive(true) 
     //print("AVAudioSession is Active") 
    } catch _ as NSError { 
     //print(error.localizedDescription) 
    } 
} catch _ as NSError { 
    //print(error.localizedDescription) 
} 
0

esto simplemente hace el truco (usando AVAudioSession)

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
try AVAudioSession.sharedInstance().setActive(true) 
Cuestiones relacionadas