10

ネイティブミュージックアプリで現在再生されているキューをプログラムで取得したい。MPMusicPlayerControllerを使用して現在再生中のアイテムを取得できますが、アイテムだけでなく再生キュー全体を取得したいと思います。AVFoundationまたは他のライブラリを使用してそれを行うことは可能ですか?

4

4 に答える 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これにより、やなどの興味深いメソッド名が見つかりました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

私はこれを調べていて、突然それがいかに簡単であるかに気づきました!

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

mediaItemCollectionは現在のプレイリストです!

お役に立てれば。

于 2012-09-13T16:16:12.163 に答える