2012-04-25 4 views
14

Je veux jouer un son même en mode silencieux dans l'iPhone.Comment lire un son en utilisant AVAudioPlayer en mode silencieux dans l'iPhone

Peut-il être fait à l'aide AVAudioPlayer (sans utiliser AVAudioSession)

(Pour ios 3.0+)

Merci à l'avance.

+4

Si l'appareil est en mode silencieux, ne joue pas son. L'utilisateur a demandé explicitement le silence! –

+0

Pourquoi sans AVAudioSession? –

+2

@JonathanGrynspan - cela fait sens quand l'utilisateur _remembers_ qu'ils ont demandé le silence, mais si vous faites des applications de nature AV, vous serez inondé de ce genre de critique: "AUDIO NE FONCTIONNE PAS ★ ☆☆☆☆" –

Répondre

27

En fait, vous pouvez le faire. Il est contrôlé via la Session Audio et n'a rien à voir avec AVAudioPlayer lui-même. Pourquoi ne voulez-vous pas utiliser AudioSession? Ils jouent bien ensemble ...

Dans votre application, vous devez initialiser la session audio, et vous pouvez également indiquer le type d'audio que vous avez l'intention de jouer. Si vous êtes un lecteur de musique, il est logique que l'utilisateur veuille entendre l'audio même si le commutateur de sonnerie/silencieux est activé.

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); 

J'ai une application que je fais cette chose, et utiliser AVAudioPlayer pour la lecture audio, et avec l'anneau/commutateur silencieux activé, je peux entendre l'audio.

MISE À JOUR (11/6/2013)

Dans l'application je mentionné ci-dessus, où je le code ci-dessus avec succès, j'ai (pendant un certain temps) été en utilisant le code suivant au lieu d'atteindre le même résultat:

 
     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 
     } 

Je pensais que je posterais ceci comme une alternative, à la lumière du commentaire le plus récent à cette réponse. :-)

+0

Merci pour votre réponse, ça a très bien fonctionné :) – Nima

+0

Content de l'entendre. :-) –

+0

J'avais l'habitude d'utiliser cette méthode mais de nos jours ça ne semble plus fonctionner. Est-ce que quelqu'un d'autre a remarqué cela? –

22

MarkGranoff's solution est correct. Cependant, si vous préférez le faire en Obj-c au lieu de C, ce qui suit fonctionne également:

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

Merci wL_.Je préfère Obj-C code pour y parvenir :) Fonctionne parfaitement – iOSAppDev

+0

Suppression des erreurs de vérification dans le code ne le rend pas Obj-C, votre ans est le même que l'original et par MarkGranoff – Thiru

+0

@Thiru cette réponse est hors de propos maintenant. Mais il a été posté avant l'édition de Mark. –

3

Les réponses ci-dessus sont correctes. Voici la version 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

Ce sera tout simplement faire le tour (en utilisant AVAudioSession)

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
try AVAudioSession.sharedInstance().setActive(true) 
Questions connexes