我想以本地音樂應用程序的編程方式獲取當前播放的隊列。我可以使用MPMusicPlayerController來獲取當前正在播放的項目,但我想要獲取的不僅僅是項目,而是整個播放隊列。是否有可能使用AVFoundation或任何其他庫?iOS - 以編程方式獲取當前正在播放的項目的隊列
謝謝
我想以本地音樂應用程序的編程方式獲取當前播放的隊列。我可以使用MPMusicPlayerController來獲取當前正在播放的項目,但我想要獲取的不僅僅是項目,而是整個播放隊列。是否有可能使用AVFoundation或任何其他庫?iOS - 以編程方式獲取當前正在播放的項目的隊列
謝謝
恐怕這是不可能的。 Apple不允許我們從任何圖書館訪問這些信息。
我一直在尋找這個,並突然意識到它有多簡單!
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
mediaItemCollection是當前的播放列表!
希望這有助於。
這是不正確的。 mediaItemCollection是由MPMediaPickerController中的選擇生成的MPMediaItemCollection。這是當場生成的新歌曲列表,與當前播放的iPod應用程序中的曲目無關。 – 2012-09-26 04:49:15
@ 0x7fffffff只是想問你是否對發佈給OP的評論有任何想法? – sooper 2014-03-18 03:00:59
我敢肯定,這是不可能通過任何公共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會拒絕您的應用程序,但有一種方法可用於hide private API calls from Apple。
感謝您的回答,似乎自上次評論以來,該功能已從相關應用中刪除。 – sooper 2014-05-10 21:53:52
我相信這是可能的。 App Store中的'Ecoute'以某種方式以編程方式檢索當前隊列,這與從應用內管理隊列無關。對於例如完全退出應用程序,進入音樂應用程序,創建一個播放列表,並播放一些曲目。然後返回到正在播放的屏幕上的應用程序,然後點擊右上角的時鐘圖標查看隊列。您會看到該播放列表中的所有曲目都在隊列中。它是如何知道哪個播放列表的?他們是否使用未記錄的API? – sooper 2014-01-31 04:12:37
@sooper我認爲他們使用的是未公開的API。請參閱下面的答案。 – bugloaf 2014-05-02 01:21:39