iOS - 以编程方式获取当前正在播放的项目队列

时间:2012-04-10 16:23:07

标签: ios avfoundation mpmusicplayercontroller mpmediaquery

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

谢谢

4 个答案:

答案 0 :(得分:7)

我很确定通过任何公共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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果你可以使用Apple私人api。 这应该是最好的。

let player = MPMusicPlayerController.systemMusicPlayer
let items = (player.value(forKey: "queueAsQuery") as! MPMediaQuery).items
//[MPMediaItem]?

答案 3 :(得分:-2)

我一直在研究这个问题,突然意识到它有多简单!

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

mediaItemCollection是当前的播放列表!

希望这会有所帮助。