2012-04-25 22 views
14

Chcę odtwarzać dźwięk nawet w trybie cichym w telefonie iPhone.Jak odtwarzać dźwięk za pomocą AVAudioPlayer w trybie cichym w telefonie iPhone

Można to zrobić za pomocą AVAudioPlayer (bez użycia AVAudioSession)

(dla iOS 3.0+)

góry dziękuję.

+4

Jeśli urządzenie jest w trybie cichym, nie odtwarza dźwięku. Użytkownik wyraźnie poprosił o ciszę! –

+0

Dlaczego bez AVAudioSession? –

+2

@JonathanGrynspan - ma to sens, gdy użytkownik _wyjaśnia_, że poprosił o ciszę, ale jeśli zrobisz aplikacje o charakterze AV, zostaniesz zalany taką opinią: "AUDIO NIE DZIAŁA ★ ☆☆☆☆" –

Odpowiedz

27

Właściwie możesz to zrobić. Jest kontrolowany przez Audio Session i nie ma nic wspólnego z samym AVAudioPlayer. Dlaczego nie chcesz korzystać z AudioSession? Grają sympatycznie razem ...

W swojej aplikacji powinieneś zainicjować Audio Session, a następnie możesz również wskazać rodzaj audio, który zamierzasz odtwarzać. Jeśli jesteś odtwarzaczem muzyki, to ma to sens, że użytkownik chciałby usłyszeć dźwięk nawet przy włączonym sygnale dzwonka/wyciszenia.

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

Mam app, że robię to bardzo rzeczą, i używać AVAudioPlayer do odtwarzania dźwięku, a przy włączonym pierścień/silent switch, słyszę dźwięk.

UPDATE (11/6/2013)

W aplikacji wspomniano powyżej, gdzie stosuje się powyższy kod skutecznie mam (na jakiś czas) został z zastosowaniem kodu, a nie w celu osiągnięcia tego samego Wynik:

 
     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 
     } 

Pomyślałem, że zamieściłbym to jako alternatywę, w świetle ostatniego komentarza do tej odpowiedzi. :-)

+0

Dzięki za Twoja odpowiedź, działało bardzo dobrze :) – Nima

+0

Miło to słyszeć. :-) –

+0

Użyłem tej metody, ale teraz wydaje mi się, że teraz nie działa. Czy ktoś inny to zauważył? –

22

MarkGranoff's solution jest poprawna. Jeśli jednak wolisz zrobić to w Obj-c zamiast C, działa również:

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

Dzięki wL_.Preferuję kod Obj-C, aby to osiągnąć :) Działa idealnie – iOSAppDev

+0

Usunięcie sprawdzania błędów w kodzie nie sprawia, że ​​Obj-C, twoje ans jest takie samo jak oryginalne ans przez MarkGranoff – Thiru

+0

@Thiru ta odpowiedź jest teraz nieistotna. Ale został opublikowany przed edycją Marka. –

3

Powyższe odpowiedzi są poprawne. Poniżej znajduje się wersja 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

To będzie po prostu rade (używając AVAudioSession)

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
try AVAudioSession.sharedInstance().setActive(true) 
Powiązane problemy