#cocoa-touch #ios5 #avaudioplayer #sleep
#cocoa-touch #ios5 #avaudioplayer #сон
Вопрос:
У меня есть серия аудиофайлов, которые я хочу воспроизвести последовательно. Я настраиваю метод делегирования audioPlayerDidFinishPlaying для запуска следующего файла в последовательности. Это работает без проблем, если я отключу блокировку экрана или запущу ее на эмуляторе или на устройстве iOS4. Однако, когда я запускаю его на отключенном устройстве, iOS5, экран заблокирован, он останавливается после первой дорожки. Есть ли какой-нибудь способ запустить новую звуковую дорожку после включения блокировки экрана?
Вот мой базовый код
// Registers this class as the delegate of the audio session.
[[AVAudioSession sharedInstance] setDelegate: self];
// Use this code instead to allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 0;
AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryMixWithOthers,
sizeof (doSetProperty),
amp;doSetProperty
);
// Registers the audio route change listener callback function
AudioSessionAddPropertyListener (
kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
self
);
// Activates the audio session.
NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: amp;activationError];
NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"m4a"];
float vol = [appSoundPlayer volume];
AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
self.appSoundPlayer = newAudio; // automatically retain audio and dealloc old file if new file is loaded
[newAudio release]; // release the audio safely
appSoundPlayer.delegate = self;
[appSoundPlayer prepareToPlay];
[appSoundPlayer setNumberOfLoops:0];
[appSoundPlayer play];
[appSoundPlayer setVolume:vol];
[progTime setProgress:0];
}
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) lappSoundPlayer successfully: (BOOL) flag {
//... code here to select nex sound track
[lappSoundPlayer play];
}
Я уже сделал так, чтобы приложение продолжало воспроизводить текущую дорожку, даже когда включается блокировка экрана, я просто не могу заставить его запустить следующую дорожку.
Примечание: Я подтвердил, что это работало в iOS4.
Ответ №1:
Настроили ли вы категорию аудиосеансов, в частности, AVAudioSessionCategoryPlayback
, как описано здесь?
[[AVAudioSession sharedInstance] setDelegate: self];
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:amp;error];
Если это не сработает, по словам пользователя ascanio в этом сообщении на форумах разработчиков Apple, еще одна вещь, которую нужно попробовать, — настроить ваше приложение на прослушивание событий удаленного управления:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
Комментарии:
1. Да, на первый вопрос. Второй вариант выглядит возможным, я проверю это — спасибо!
2. В ходе предварительного тестирования второе решение работает, я назначу заслуженную награду после завершения тестирования.
3. Надеюсь, это сработает! Но я чувствую вину за то, что принял награду, поскольку я только что наткнулся на ваш вопрос и увидел, что никто на него не ответил.
4. Выглядит великолепно, я так рад, что кто-то наконец ответил — не нужно винить себя.
5. Похоже, у меня это не работает… Я пытаюсь продолжить воспроизведение звука и после блокировки экрана, но когда я добавляю этот код, экран блокировки просто останавливает запуск моего приложения в iOS5 .. вы зарегистрировали что-то еще, чтобы разрешить звук?