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

问题描述 投票:10回答:4

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

ios avfoundation mpmusicplayercontroller mpmediaquery
4个回答
2
投票

恐怕这是不可能的。 Apple不允许我们从任何库访问此信息。


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


2
投票

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

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

-2
投票

我一直在研究,突然意识到它是如此简单!

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

mediaItemCollection是当前播放列表!

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.