Как воспроизвести звук с помощью AVAudioPlayer в беззвучном режиме на iPhone

Я хочу воспроизвести звук даже в беззвучном режиме на iPhone.

Можно ли это сделать с помощью AVAudioPlayer (без использования AVAudioSession)

(Для iOS 3.0+)

Заранее спасибо.


person Nima    schedule 25.04.2012    source источник
comment
Если устройство находится в беззвучном режиме, звук не воспроизводится. Пользователь явно запросил тишину!   -  person Jonathan Grynspan    schedule 25.04.2012
comment
@JonathanGrynspan - это имеет смысл, когда пользователь помнит, что он просил тишины, но если вы создаете приложения AV-приложения, вы будете завалены отзывами такого рода: АУДИО НЕ РАБОТАЕТ ★☆☆☆ ☆   -  person Rhythmic Fistman    schedule 10.10.2012


Ответы (5)


На самом деле, вы можете это сделать. Он управляется через аудиосеанс и не имеет ничего общего с самим AVAudioPlayer. Почему вы не хотите использовать AudioSession? Они хорошо играют вместе...

В вашем приложении вы должны инициализировать аудиосеанс, а затем вы также можете указать, какой звук вы собираетесь воспроизводить. Если вы музыкальный проигрыватель, то вполне логично, что пользователь захочет слышать звук, даже с включенным переключателем звонка/без звука.

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

У меня есть приложение, в котором я делаю именно это, и использую AVAudioPlayer для воспроизведения звука, и с включенным переключателем «звонок/без звука» я слышу звук.

ОБНОВЛЕНИЕ (6 ноября 2013 г.)

В приложении, о котором я упоминал выше, где я успешно использовал приведенный выше код, я (в течение некоторого времени) вместо этого использовал следующий код для достижения того же результата:

        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
        }

Я думал, что опубликую это в качестве альтернативы в свете самого последнего комментария к этому ответу. :-)

person Mark Granoff    schedule 25.04.2012
comment
Раньше я использовал этот метод, но в наши дни он, похоже, больше не работает. Кто-нибудь еще заметил это? - person Allen S; 06.11.2013
comment
@iphonic Не знаю, что тебе сказать. Код, который я опубликовал 06.11.2013, — это код, который у меня есть сегодня в приложении, то есть в App Store. И это на моем собственном телефоне (большой сюрприз). Я слышу звук в приложении, когда переключатель «Звонок/Без звука» на моем телефоне установлен в положение «Без звука». Ваша громкость не может быть полностью уменьшена; убедитесь, что ваша громкость включена. Кроме предоставления пользовательскому интерфейсу управления громкостью и воспроизведением, у вас нет программного способа увеличить громкость, если это проблема. - person Mark Granoff; 15.12.2013

решение MarkGranoff верно. Однако, если вы предпочитаете делать это в Obj-c вместо C, также работает следующее:

    NSError *error = nil;
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
    [[AVAudioSession sharedInstance] setActive:YES error:&error];
person wL_    schedule 13.10.2012
comment
Спасибо wL_. Я предпочитаю код Obj-C для достижения этой цели :) Работает отлично - person iOSAppDev; 18.07.2014
comment
Удаление проверки ошибок в коде не делает его Obj-C, ваш ответ такой же, как и оригинальный ответ MarkGranoff - person Thiru; 27.05.2015
comment
@Thiru, этот ответ сейчас неактуален. Но это было опубликовано до редактирования Марка. - person wL_; 05.12.2015

Приведенные выше ответы верны. Ниже приведена версия 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)
}
person SHS    schedule 17.06.2016

Простая версия Swift 4:

try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
person Leon    schedule 27.02.2019

Это просто поможет (используя AVAudioSession)

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
person Johann Burgess    schedule 13.02.2018