Jak odtwarzać dźwięk za pomocą AVAudioPlayer w trybie cichym w iPhonie

Chcę odtwarzać dźwięk nawet w trybie cichym w iPhonie.

Czy można to zrobić używając AVAudioPlayer (bez użycia AVAudioSession)

(dla ios 3.0+)

Z góry dzięki.

Author: Nima, 2012-04-25

4 answers

Możesz to zrobić. Jest kontrolowany przez sesję Audio i nie ma nic wspólnego z samym AVAudioPlayer. Dlaczego nie chcesz użyć Audiosesji? Dobrze się razem bawią...

W aplikacji powinieneś zainicjować sesję Audio, a następnie możesz również określić, jakiego rodzaju dźwięk chcesz odtworzyć. Jeśli jesteś odtwarzaczem muzyki, to ma to sens, że użytkownik chciałby usłyszeć dźwięk nawet z włączonym przełącznikiem ring/silent.

    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 aplikacja, która robię to samo i używam AVAudioPlayer do odtwarzania dźwięku, a przy włączonym przełączniku pierścieniowym/cichym słyszę dźwięk.

Aktualizacja (11/6/2013)

W aplikacji, o której wspomniałem powyżej, gdzie z powodzeniem wykorzystałem powyższy kod, używam (od pewnego czasu) następującego kodu, aby osiągnąć ten sam 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 zamieszczę to jako alternatywę, w świetle najnowszego komentarza do tej odpowiedzi. :-)

 27
Author: Mark Granoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 16:51:04

Rozwiązanie Markgranoffa jest poprawne. Jednak, jeśli wolisz to zrobić w Obj-c zamiast C, następujące działania również:

    NSError *error = nil;
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
    [[AVAudioSession sharedInstance] setActive:YES error:&error];
 23
Author: wL_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:13

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)
}
 4
Author: SHS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 06:30:40

To po prostu zrobi sztuczkę (używając AVAudioSession)

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
 0
Author: Johann Burgess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-13 08:34:45