2012-04-10 93 views
9

我想以本地音乐应用程序的编程方式获取当前播放的队列。我可以使用MPMusicPlayerController来获取当前正在播放的项目,但我想要获取的不仅仅是项目,而是整个播放队列。是否有可能使用AVFoundation或任何其他库?iOS - 以编程方式获取当前正在播放的项目的队列

谢谢

+1

我相信这是可能的。 App Store中的'Ecoute'以某种方式以编程方式检索当前队列,这与从应用内管理队列无关。对于例如完全退出应用程序,进入音乐应用程序,创建一个播放列表,并播放一些曲目。然后返回到正在播放的屏幕上的应用程序,然后点击右上角的时钟图标查看队列。您会看到该播放列表中的所有曲目都在队列中。它是如何知道哪个播放列表的?他们是否使用未记录的API? – sooper 2014-01-31 04:12:37

+0

@sooper我认为他们使用的是未公开的API。请参阅下面的答案。 – bugloaf 2014-05-02 01:21:39

回答

2

恐怕这是不可能的。 Apple不允许我们从任何图书馆访问这些信息。

-2

我一直在寻找这个,并突然意识到它有多简单!

- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection 

mediaItemCollection是当前的播放列表!

希望这有助于。

+0

这是不正确的。 mediaItemCollection是由MPMediaPickerController中的选择生成的MPMediaItemCollection。这是当场生成的新歌曲列表,与当前播放的iPod应用程序中的曲目无关。 – 2012-09-26 04:49:15

+0

@ 0x7fffffff只是想问你是否对发布给OP的评论有任何想法? – sooper 2014-03-18 03:00:59

6

我敢肯定,这是不可能通过任何公共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); 

这才转身像numberOfItemsnowPlayingItemAtIndex:一些有趣的方法名。所以我这一类加在文件的顶部:

@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

+0

感谢您的回答,似乎自上次评论以来,该功能已从相关应用中删除。 – sooper 2014-05-10 21:53:52

相关问题