我想以编程方式获取当前在本机音乐应用程序中播放的队列。我可以使用MPMusicPlayerController来获取当前正在播放的项目,但我不仅想获取项目,还想获取整个播放队列。是否可以使用AVFoundation或任何其他库来做到这一点?
问问题
2719 次
4 回答
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);
这出现了一些有趣的方法名称,例如numberOfItems
and 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 会拒绝你的应用程序,但是有一种方法可以隐藏来自 Apple 的私有 API 调用。
于 2014-05-02T01:20:49.190 回答
3
如果可以使用 Apple 私有 api。这应该是最好的。
let player = MPMusicPlayerController.systemMusicPlayer
let items = (player.value(forKey: "queueAsQuery") as! MPMediaQuery).items
//[MPMediaItem]?
于 2018-03-28T09:19:39.677 回答
2
恐怕这是不可能的。Apple 不允许我们从任何图书馆访问这些信息。
于 2012-04-11T08:59:06.263 回答
-2
I've been looking into this and suddenly realized how simple it is!
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
mediaItemCollection is the current playlist!
hope this helps.
于 2012-09-13T16:16:12.163 回答