Я хочу воспроизвести звук даже в беззвучном режиме на iPhone.
Можно ли это сделать с помощью AVAudioPlayer (без использования AVAudioSession)
(Для iOS 3.0+)
Заранее спасибо.
Я хочу воспроизвести звук даже в беззвучном режиме на iPhone.
Можно ли это сделать с помощью AVAudioPlayer (без использования AVAudioSession)
(Для iOS 3.0+)
Заранее спасибо.
На самом деле, вы можете это сделать. Он управляется через аудиосеанс и не имеет ничего общего с самим 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 }
Я думал, что опубликую это в качестве альтернативы в свете самого последнего комментария к этому ответу. :-)
решение MarkGranoff верно. Однако, если вы предпочитаете делать это в Obj-c вместо C, также работает следующее:
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];
Приведенные выше ответы верны. Ниже приведена версия 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)
}
Простая версия Swift 4:
try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
Это просто поможет (используя AVAudioSession
)
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)