【问题标题】:iOS - get programmatically queue of items currently playingiOS - 以编程方式获取当前正在播放的项目队列
【发布时间】:2012-04-22 23:16:52
【问题描述】:

我想以编程方式获取当前在原生音乐应用中播放的队列。我可以使用 MPMusicPlayerController 来获取当前正在播放的项目,但我不仅想获取项目,还想获取整个播放队列。是否可以使用 AVFoundation 或任何其他库来做到这一点?

【问题讨论】:

  • 我确信这是可能的。 App Store 中的“Ecoute”以某种方式以编程方式检索当前队列,这与在应用程序内管理队列无关。例如完全退出应用程序,进入音乐应用程序并创建一个包含一些曲目的播放列表并播放它。然后回到应用程序,进入正在播放的屏幕,点击右上角的时钟图标查看队列。您会看到该播放列表中的所有曲目都在队列中。它怎么知道是哪个播放列表?他们是否在使用未记录的 API?
  • @sooper 我认为他们正在使用未记录的 API。请参阅下面的答案。

标签: ios avfoundation mpmusicplayercontroller mpmediaquery


【解决方案1】:

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

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

【讨论】:

  • 这仅在您自己实际设置队列后才有效。此外,它仅适用于本地 MPMediaItems,不适用于 Apple Music 歌曲的播放。鉴于您已经可以自己手动管理队列,虽然这确实有效,但它的限制有点让它毫无用处。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答,自从我上次发表评论以来,该功能似乎已从相关应用程序中删除。
  • 这不再适用于 iOS 12.2。我收到一个错误:“索引没有媒体项目:10142980306396550453”尽管我传入的索引为 3,而不是 10142980306396550453。
  • @joey 你做了更多的测试吗?我已经开始设计新的应用程序,但如果没有这个功能,它将毫无用处
  • 永远无法弄清楚。如果 100% 依赖此功能,我的建议是不要构建应用程序。
【解决方案3】:

我一直在研究这个,突然意识到它是多么简单!

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

mediaItemCollection 是当前播放列表!

希望这会有所帮助。

【讨论】:

  • 这是不正确的。 mediaItemCollection 是由 MPMediaPickerController 中的选择生成的 MPMediaItemCollection。这是现场生成的新歌曲列表,与iPod app中当前播放的曲目无关。
  • @0x7fffffff 只是想问一下您对我在 OP 上发表的评论有什么想法吗?
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多