Мне было интересно, вы бы обновили пользовательский интерфейс, когда песня изменится в MPMusicPlayerController. Например, если у вас есть представление изображения с обложкой альбома, но пользователь нажимает кнопку пропуска, как бы вы обновили изображение представления изображения с новой обложкой альбома?
Как обновить MPMusicPlayerController при смене песни
Ответы (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];
}
Если вы ищете информацию о воспроизведении экрана блокировки:
Взгляните на 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];
}