Неправильное состояние воспроизведения в MP Music Player Controller в ios 5
Я получаю неправильное состояние воспроизведения в музыкальном проигрывателе MP. во время воспроизведения песни я нахожусь в состоянии паузы. Мое приложение работает нормально в iOS 4. Но у меня есть эта проблема в iOS 5. Кто-нибудь может мне помочь??
Мой код здесь.
[musicPlayer stop];
if (userMediaItemCollection)
{
userMediaItemCollection=nil;
}
musicPlayer.nowPlayingItem=nil;
userMediaItemCollection=[MPMediaItemCollection collectionWithItems:[mediaItemCollection items]];
[musicPlayer setQueueWithItemCollection:userMediaItemCollection];
[musicPlayer setNowPlayingItem:
[[userMediaItemCollectionitems]objectAtIndex:indexOfCurrentObject]];
[self enablePrevAndNextButtons];
[musicPlayer play];
}
-(void)playbackStateDidChanged:(NSNotification *)notification
{
if (musicPlayer.playbackState!=MPMusicPlaybackStatePlaying)
{
[playPauseButton setBackgroundImage:[UIImage imageNamed:@"play_iPad.png"] forState:UIControlStateNormal];
}
else if(musicPlayer.playbackState==MPMusicPlaybackStatePlaying)
{
[playPauseButton setBackgroundImage:[UIImage imageNamed:@"pause_iPad.png"] forState:UIControlStateNormal];
}
5 ответов
Я также сообщил об этой ошибке в Apple. Я смог воспроизвести его 100% времени, выполнив следующие действия:
Запустите приложение, которое использует MPMusicPlayerController. Запустите приложение "Музыка". Нажмите "Воспроизвести", "Пропустить", "Пропустить", "Приостановить", "Воспроизвести", "Приостановить". Откройте исходное приложение, и MPMusicPlaybackState в MPMusicPlayerController будет неправильным.
Ни одно из предложенных здесь решений не помогло мне. Решение, которое действительно работало, состояло в том, чтобы отслеживать, когда произошла ошибка, и обновлять пользовательский интерфейс, особенно в этих случаях.
Когда UIApplicationDidBecomeActiveNotification
уведомление получено (см. сообщение matbur для более подробной информации об этом), посмотрите, не воспроизводится ли аудио на самом деле, когда MPMusicPlaybackState сказал, что это было:
-(BOOL) isPlaybackStateBugActive {
MPMusicPlaybackState playbackState = self.musicPlayer.playbackState;
if (playbackState == MPMusicPlaybackStatePlaying) {
AudioSessionInitialize (NULL, NULL, NULL, NULL);
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
AudioSessionSetActive (true);
UInt32 audioIsPlaying;
UInt32 size = sizeof(audioIsPlaying);
AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &size, &audioIsPlaying);
if (!audioIsPlaying){
NSLog(@"PlaybackState bug is active");
return YES;
}
}
return NO;
}
Не забудьте импортировать каркас AudioToolbox.
Ни один из этих обходных путей не устранил проблему для моего приложения. Это ошибка в iOS, и мое приложение никогда не будет работать должным образом, пока Apple не исправит это.
У меня есть музыкальный проигрыватель с кнопкой воспроизведения / паузы. Когда играет музыка, на кнопке отображается значок "пауза". Когда музыка находится в режиме паузы, на кнопке отображается значок "Воспроизведение" - как и во всех музыкальных приложениях. Я могу повторить ошибку в любое время, выполнив следующие действия: 1. Воспроизведите музыку в моем приложении (кнопка "Воспроизвести / Пауза" правильно отображает значок "Пауза") 2. Отключить фоновое изображение моего приложения и заблокировать телефон на ~10 минут 3. Удвоить нажмите "Домой" и нажмите кнопку "Пауза" на панели управления iPod. 4. Разблокируйте мой телефон и снова откройте мое приложение. 5. Музыка будет остановлена, но мое приложение по-прежнему отображает значок "Пауза", когда оно должно "воспроизвести".
Я провел обширную отладку и ведение журнала, чтобы гарантировать, что метод, который обновляет мою кнопку воспроизведения / паузы, всегда вызывается, когда мое приложение становится активным. Проблема заключается в том, что при повторном входе в мое приложение состояние воспроизведения MPMusicPlayer все еще устанавливается на MPMusicPlaybackStatePlaying, даже когда музыка остановлена / приостановлена.
Я подал отчет об ошибке для этого около года назад и ничего не слышал от Apple. Если кто-то еще подаст один, это будет очень цениться.
У меня та же проблема, но когда я играю / приостанавливаю много раз, когда мое приложение работает в фоновом режиме, я сообщаю об ошибке в Apple и надеюсь получить ответ в ближайшее время, я хочу знать, неверно ли написано мое кодирование или есть проблема с API. Если это была ваша ошибка, это может быть полезно. Я нашел обходной путь, который, хотя и не является лучшим решением, для моего приложения приемлем:
В viewDidLoad добавьте это:
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver: self
selector: @selector (handle_ApplicationDidBecomeActive:)
name: UIApplicationDidBecomeActiveNotification
object: nil];
Затем создайте метод handle_ApplicationDidBecomeActive и добавьте его:
- (void) handle_ApplicationDidBecomeActive: (id) notification
{
if (musicPlayer.playbackState!=MPMusicPlaybackStatePlaying)
{
[playPauseButton setBackgroundImage:[UIImage imageNamed:@"play_iPad.png"] forState:UIControlStateNormal];
[musicPlayer pause];
}
else if(musicPlayer.playbackState==MPMusicPlaybackStatePlaying)
{
[playPauseButton setBackgroundImage:[UIImage imageNamed:@"pause_iPad.png"] forState:UIControlStateNormal];
[musicPlayer pause];
}
}
(не помещайте этот код в ваш метод PlayStateDidChanged, так как это может создать бесконечный цикл)
Это синхронизирует состояние ваших кнопок и музыкального проигрывателя с тем, о котором сообщает API. в случаях, когда есть совпадение, никакого воздействия не будет, в других случаях игрок будет соответственно приостанавливать / играть.
Этот код используется при нажатии предыдущей кнопки Предыдущая песня будет воспроизведена
- (IBAction)playPreviousSongInList:(id)sender {
static NSTimeInterval skipToBeginningOfSongIfElapsedTimeLongerThan = 3.5;
NSTimeInterval playbackTime = self.musicPlayer.currentPlaybackTime;
if (playbackTime <= skipToBeginningOfSongIfElapsedTimeLongerThan) {
[self.musicPlayer skipToPreviousItem];
} else {
[self.musicPlayer skipToBeginning];
}
}
У меня возникла та же проблема с выпуском iOS 5. Я обнаружил, что свойство PlayState обновляется, но с некоторой задержкой, поэтому оно еще не установлено, когда запускается ваш воспроизведение StateDidChanged.
Мой обходной путь должен был установить мою собственную переменную экземпляра с названием musicPlayerRecentlyStartedPlaying всякий раз, когда я начинаю воспроизведение. Затем я использую метод, вызванный из таймера, чтобы проверить и эту переменную, и свойство PlayState, чтобы выяснить, действительно ли проигрыватель играет:
- (void)playMusic {
[self.musicPlayer play];
self.musicPlayerRecentlyStartedPlaying = TRUE;
self.musicControlsUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateMusicControls:) userInfo:nil repeats:TRUE];
}
- (void)stopMusic {
[self.musicPlayer stop];
self.musicPlayerRecentlyStartedPlaying = FALSE;
[self.musicControlsUpdateTimer invalidate];
}
- (void)updateMusicControls:(NSTimer *)timer {
BOOL playing = (([self.musicPlayer playbackState] == MPMusicPlaybackStatePlaying)&&(self.musicPlayer.nowPlayingItem));
if (!playing) {
// check to see if we recently started playing
if (self.musicPlayerRecentlyStartedPlaying) {
playing = TRUE;
}
} else {
// once the property is updated, we no longer need this
self.musicPlayerRecentlyStartedPlaying = FALSE;
}
}
Возможно, вам не нужно вызывать updateMusicControls из таймера, но я это делаю, потому что я также обновляю положение индикатора выполнения по мере воспроизведения музыки.