如何使用 MPMediaItem 属性持久 ID 在 iPhone 音乐播放器框架中播放音乐?

Posted

技术标签:

【中文标题】如何使用 MPMediaItem 属性持久 ID 在 iPhone 音乐播放器框架中播放音乐?【英文标题】:How do you use MPMediaItemPropertyPersistentID to play music in iPhone Music Player Framework? 【发布时间】:2010-12-31 15:25:40 【问题描述】:

我的代码成功地为我的整个音乐库编目歌曲名称和 ID。但是,它实际上不会使用这种方法播放歌曲,并且控制台会显示以下内容:

消息播放状态超时。

消息 nowPlayingItem 超时。

self.musicPlayer = [MPMusicPlayerController applicationMusicPlayer];

MPMediaQuery *everything = [[MPMediaQuery alloc] init];
NSArray *itemsFromGenericQuery = [everything items];
SongName = [[NSMutableArray alloc] init];
SongItem = [[NSMutableArray alloc] init];
NSString *songTitle;
NSString *songID;
//Collect names & ID for entire music library & put into arrays
for (MPMediaItem *song in itemsFromGenericQuery) 
songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
[SongName addObject:songTitle];
songID = [song valueForProperty: MPMediaItemPropertyPersistentID];
[SongItem addObject:songID];


NSLog (@"%@", [SongName objectAtIndex:1]);
NSLog (@"%@", [SongItem objectAtIndex:1]);
// Play the second song in the list
MPMediaItemCollection *collection = [MPMediaItemCollection collectionWithItems:[NSArray arrayWithObject:[SongItem objectAtIndex:1]]];
[self.musicPlayer setQueueWithItemCollection:collection];
[self.musicPlayer play];

【问题讨论】:

【参考方案1】:

再次,我将回答我自己的问题。问题是 collectionWithItems: 需要一个 MPMediaItems 数组,而不是 MPMediaItemPropertyPersistentIDs 数组。以下是可能遇到相同问题的任何人的工作代码:

MPMediaQuery *everything = [[MPMediaQuery alloc] init];
NSArray *itemsFromGenericQuery = [everything items];
SongItem = [[NSMutableArray alloc] init];
for (MPMediaItem *song in itemsFromGenericQuery) 
   NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
   //NSLog (@”%@”, songTitle);
   songID = [song valueForProperty: MPMediaItemPropertyPersistentID];
   //NSLog (@”%@”, songID);
   [SongItem addObject:songID];


//Choose the first indexed song
NSString *selectedTitle = [SongItem objectAtIndex:0];

//Use the MPMediaItemPropertyPersistentID to play the song
MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:selectedTitle forProperty:MPMediaItemPropertyPersistentID];
MPMediaQuery *mySongQuery = [[MPMediaQuery alloc] init];
[mySongQuery addFilterPredicate: predicate];
[musicPlayer setQueueWithQuery:mySongQuery];
[musicPlayer play];

【讨论】:

上面的代码只有一个小问题(虽然不会特别影响这个例子)。与 MPMediaItemPropertyPersistentID 关联的类型是 NSNumber,而不是 NSString。因此,selectedTitle 的类型应该是 NSNumber*。这是 Apple 的文档:(developer.apple.com/library/ios/#documentation/mediaplayer/…) 但是我们将如何获取 iPhone 5s 中 MPMediaItemPropertyPersistentID 的值。对于我设备中的一些音乐,它返回一个负的 track_id,因为值溢出。我正在使用 NSNumber numberWithLong:

以上是关于如何使用 MPMediaItem 属性持久 ID 在 iPhone 音乐播放器框架中播放音乐?的主要内容,如果未能解决你的问题,请参考以下文章

尝试跨启动持久化 MPMediaItem

如何在 MPMediaPlaylist 中获取 MPMediaItem 顺序?

目标 C:获取 MPMediaItem 'Favorite' 属性

批量获取多个 MPMediaItem 的属性

为啥 MPMediaEntity / MPMediaItem 使用 valueForProperty?

来自曲目 MPMediaItem 的专辑插图