我想以本地音乐应用程序的编程方式获取当前播放的队列。我可以使用MPMusicPlayerController来获取当前正在播放的项目,但我想要获取的不仅仅是项目,而是整个播放队列。是否有可能使用AVFoundation或任何其他库?iOS - 以编程方式获取当前正在播放的项目的队列
谢谢
我想以本地音乐应用程序的编程方式获取当前播放的队列。我可以使用MPMusicPlayerController来获取当前正在播放的项目,但我想要获取的不仅仅是项目,而是整个播放队列。是否有可能使用AVFoundation或任何其他库?iOS - 以编程方式获取当前正在播放的项目的队列
谢谢
恐怕这是不可能的。 Apple不允许我们从任何图书馆访问这些信息。
我一直在寻找这个,并突然意识到它有多简单!
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
mediaItemCollection是当前的播放列表!
希望这有助于。
这是不正确的。 mediaItemCollection是由MPMediaPickerController中的选择生成的MPMediaItemCollection。这是当场生成的新歌曲列表,与当前播放的iPod应用程序中的曲目无关。 – 2012-09-26 04:49:15
@ 0x7fffffff只是想问你是否对发布给OP的评论有任何想法? – sooper 2014-03-18 03:00:59
我敢肯定,这是不可能通过任何公共API。 @sooper提到的Ecoute应用程序必须使用私有API。我在我自己的音乐应用程序的代码库中做了一个小实验。首先,我用这个代码列表中的iPod音乐播放器(把#import <objc/runtime.h>
在顶部)中的所有方法:
int i=0;
unsigned int mc = 0;
Method * mlist = class_copyMethodList([MPMusicPlayerController iPodMusicPlayer].class, &mc);
NSLog(@"%d methods for class", mc);
for(i=0;i<mc;i++) {
NSLog(@"\tMethod no #%d: %s", i, sel_getName(method_getName(mlist[i])));
}
free(mlist);
这才转身像numberOfItems
和nowPlayingItemAtIndex:
一些有趣的方法名。所以我这一类加在文件的顶部:
@interface MPMusicPlayerController (Private)
- (NSInteger)numberOfItems;
- (MPMediaItem*)nowPlayingItemAtIndex:(NSInteger)index;
@end
,我跑这个代码:
NSInteger numberOfItems = [[MPMusicPlayerController iPodMusicPlayer] numberOfItems];
for (NSInteger i = 0; i < numberOfItems; i++) {
MPMediaItem* mi = [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItemAtIndex:i];
NSLog(@"%@", [mi valueForProperty:MPMediaItemPropertyTitle]);
}
果然,它印出来,我已经在音乐应用排队播放列表!
当然,如果您以这种方式调用这些方法,Apple会拒绝您的应用程序,但有一种方法可用于hide private API calls from Apple。
感谢您的回答,似乎自上次评论以来,该功能已从相关应用中删除。 – sooper 2014-05-10 21:53:52
我相信这是可能的。 App Store中的'Ecoute'以某种方式以编程方式检索当前队列,这与从应用内管理队列无关。对于例如完全退出应用程序,进入音乐应用程序,创建一个播放列表,并播放一些曲目。然后返回到正在播放的屏幕上的应用程序,然后点击右上角的时钟图标查看队列。您会看到该播放列表中的所有曲目都在队列中。它是如何知道哪个播放列表的?他们是否使用未记录的API? – sooper 2014-01-31 04:12:37
@sooper我认为他们使用的是未公开的API。请参阅下面的答案。 – bugloaf 2014-05-02 01:21:39