2012-04-10 95 views
9

我想以本地音樂應用程序的編程方式獲取當前播放的隊列。我可以使用MPMusicPlayerController來獲取當前正在播放的項目,但我想要獲取的不僅僅是項目,而是整個播放隊列。是否有可能使用AVFoundation或任何其他庫?iOS - 以編程方式獲取當前正在播放的項目的隊列

謝謝

+1

我相信這是可能的。 App Store中的'Ecoute'以某種方式以編程方式檢索當前隊列,這與從應用內管理隊列無關。對於例如完全退出應用程序,進入音樂應用程序,創建一個播放列表,並播放一些曲目。然後返回到正在播放的屏幕上的應用程序,然後點擊右上角的時鐘圖標查看隊列。您會看到該播放列表中的所有曲目都在隊列中。它是如何知道哪個播放列表的?他們是否使用未記錄的API? – sooper 2014-01-31 04:12:37

+0

@sooper我認爲他們使用的是未公開的API。請參閱下面的答案。 – bugloaf 2014-05-02 01:21:39

回答

2

恐怕這是不可能的。 Apple不允許我們從任何圖書館訪問這些信息。

-2

我一直在尋找這個,並突然意識到它有多簡單!

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

mediaItemCollection是當前的播放列表!

希望這有助於。

+0

這是不正確的。 mediaItemCollection是由MPMediaPickerController中的選擇生成的MPMediaItemCollection。這是當場生成的新歌曲列表,與當前播放的iPod應用程序中的曲目無關。 – 2012-09-26 04:49:15

+0

@ 0x7fffffff只是想問你是否對發佈給OP的評論有任何想法? – sooper 2014-03-18 03:00:59

6

我敢肯定,這是不可能通過任何公共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

+0

感謝您的回答,似乎自上次評論以來,該功能已從相關應用中刪除。 – sooper 2014-05-10 21:53:52

相關問題