Как обновить MPMusicPlayerController при смене песни

Мне было интересно, вы бы обновили пользовательский интерфейс, когда песня изменится в MPMusicPlayerController. Например, если у вас есть представление изображения с обложкой альбома, но пользователь нажимает кнопку пропуска, как бы вы обновили изображение представления изображения с новой обложкой альбома?


person somepers    schedule 05.06.2015    source источник


Ответы (2)


Для управления воспроизведением музыки мы используем экземпляр MPMusicPlayerController. Есть два типа музыкальных плееров. iPodMusicPlayer — это ссылка на экземпляр музыкального проигрывателя, используемый приложением iPod. Любые измененные вами настройки, такие как режимы воспроизведения в случайном порядке или повторения, также будут изменены в приложении iPod. Если iPod воспроизводится во время запуска вашего приложения, музыка будет продолжать воспроизводиться, и вы сможете получить доступ к текущей песне, а также переходить назад и вперед по текущему активному плейлисту. Когда ваше приложение закроется, музыка продолжит играть. Я полагаю, что этот режим очень удобен для большинства служебных приложений, которые пытаются улучшить качество прослушивания музыки, взаимодействуя с iPod. Напротив, приложение MusicPlayer предоставляет вам музыкальный проигрыватель, настройки которого вы можете изменять независимо от приложения iPod. Это, вероятно, путь, если ваше приложение является игрой, и вы хотите дать пользователю возможность выбирать фоновую музыку из своей библиотеки. В Songtext мы будем использовать iPodMusicPlayer, потому что хотим знать, какая песня воспроизводится при запуске нашего приложения:

@property (nonatomic, strong) MPMusicPlayerController *musicPlayer;
self.musicPlayer = [MPMusicPlayerController iPodMusicPlayer];

Музыкальный проигрыватель использует уведомления, чтобы информировать вас об изменениях: – текущей песни (MPMusicPlayerControllerNowPlayingItemDidChangeNotification), – состояния воспроизведения/паузы/остановки (MPMusicPlayerControllerPlaybackStateDidChangeNotification) или – громкости (MPMusicPlayerControllerVolumeDidChangeNotification). Итак, следующее обычно вы регистрируетесь в качестве наблюдателя за интересующими вас уведомлениями, например. в представленииDidLoad. Мы хотим получать все 3 уведомления:

// Register for music player notifications
NSNotificationCenter *notificationCenter = [NSNotificationCenter   defaultCenter];
[notificationCenter addObserver:self 
                   selector:@selector(handleNowPlayingItemChanged:)
                        name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
                     object:self.musicPlayer];
[notificationCenter addObserver:self 
                   selector:@selector(handlePlaybackStateChanged:)
                       name:MPMusicPlayerControllerPlaybackStateDidChangeNotification 
                     object:self.musicPlayer];
[notificationCenter addObserver:self 
                   selector:@selector(handleExternalVolumeChanged:)
                        name:MPMusicPlayerControllerVolumeDidChangeNotification 
                     object:self.musicPlayer];
[self.musicPlayer beginGeneratingPlaybackNotifications];

Существует еще одно связанное уведомление, которое отправляется медиатекой iPod при изменении содержимого библиотеки, например. когда вы синхронизируете свое устройство с iTunes. Вы должны прослушать это уведомление, если ваше приложение создает свои списки воспроизведения, которые необходимо обновить после изменений в библиотеке. Для этого зарегистрируйтесь в качестве наблюдателя за уведомлениями MPMediaLibraryDidChangeNotification и вызовите:

[[MPMediaLibrary defaultMediaLibrary] beginGeneratingLibraryChangeNotifications]

Обработчики уведомлений — это место, где вы обновляете свой пользовательский интерфейс в ответ на изменения в состоянии игрока:

// Когда текущий воспроизводимый элемент изменится, обновите метки информации о песне и отображение обложки. - (void)handleNowPlayingItemChanged:(id)notification { // Запрашиваем у музыкального проигрывателя текущую песню. MPMediaItem *currentItem = self.musicPlayer.nowPlayingItem;

// Display the artist, album, and song name for the now-playing media item.
// These are all UILabels.
self.songLabel.text   = [currentItem valueForProperty:MPMediaItemPropertyTitle];
self.artistLabel.text = [currentItem valueForProperty:MPMediaItemPropertyArtist];
self.albumLabel.text  = [currentItem valueForProperty:MPMediaItemPropertyAlbumTitle];    

// Display album artwork. self.artworkImageView is a UIImageView.
CGSize artworkImageViewSize = self.artworkImageView.bounds.size;
MPMediaItemArtwork *artwork = [currentItem valueForProperty:MPMediaItemPropertyArtwork];
if (artwork != nil) {
    self.artworkImageView.image = [artwork imageWithSize:artworkImageViewSize];
} else {
    self.artworkImageView.image = nil;
}

}

// When the playback state changes, set the play/pause button appropriately.
- (void)handlePlaybackStateChanged:(id)notification {
MPMusicPlaybackState playbackState = self.musicPlayer.playbackState;
if (playbackState == MPMusicPlaybackStatePaused || playbackState == MPMusicPlaybackStateStopped) {
    [self.playPauseButton setTitle:@"Play" forState:UIControlStateNormal];
} else if (playbackState == MPMusicPlaybackStatePlaying) {
    [self.playPauseButton setTitle:@"Pause" forState:UIControlStateNormal];
}

}

// When the volume changes, sync the volume slider
- (void)handleExternalVolumeChanged:(id)notification {
// self.volumeSlider is a UISlider used to display music volume.
// self.musicPlayer.volume ranges from 0.0 to 1.0.
[self.volumeSlider setValue:self.musicPlayer.volume animated:YES];

}

person Uma_Shanker_Tiwari    schedule 05.06.2015

Если вы ищете информацию о воспроизведении экрана блокировки:

Взгляните на MPNowPlayingInfoCenter.

Вам нужно передать NSDictionary, вот пример:

-(void)updateNowPlayingInfo
{
    //Set Values for MPNowPlayingInfoCenter
    NSArray *keys = [NSArray arrayWithObjects:
                     MPMediaItemPropertyTitle,
                     MPMediaItemPropertyPlaybackDuration,
                     MPNowPlayingInfoPropertyPlaybackRate,
                     MPNowPlayingInfoPropertyElapsedPlaybackTime,
                     nil];

    NSArray *values = [NSArray arrayWithObjects:
                       self.currentPlayingVideo.title,
                       [NSNumber numberWithFloat:self.currentPlayingVideo.duration],
                       [NSNumber numberWithInt:1],
                       [NSNumber numberWithDouble:self.currentVideoPlayView.videoPlayerViewController.moviePlayer.currentPlaybackTime],
                       nil];

    NSDictionary *mediaInfo = [NSDictionary dictionaryWithObjects:values forKeys:keys];
    [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo];
}
person Jasper    schedule 05.06.2015