iOS - получить программную очередь предметов, которые сейчас играют
Я хочу получить программную очередь, которая в данный момент воспроизводится в родном приложении Music. Я могу использовать MPMusicPlayerController для получения текущего воспроизводимого элемента, но я хочу получить не только элемент, но и всю очередь воспроизведения. Можно ли сделать это с помощью AVFoundation или любой другой библиотеки?
Спасибо
4 ответа
Боюсь, это невозможно. Apple не предоставляет нам доступ к этой информации из каких-либо библиотек.
Я уверен, что это невозможно с помощью любого публичного API. Приложение Ecoute, которое упоминает @sooper, должно использовать частные 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]);
}
и, конечно же, он распечатал список воспроизведения, который я поставил в очередь в приложении Music!
Конечно, если вы вызовете эти методы таким образом, Apple отклонит ваше приложение, но есть способ скрыть частные вызовы API от Apple.
Если вы можете использовать Apple, частный API. это должно быть лучше.
let player = MPMusicPlayerController.systemMusicPlayer
let items = (player.value(forKey: "queueAsQuery") as! MPMediaQuery).items
//[MPMediaItem]?
Я посмотрел на это и вдруг понял, как все просто!
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
mediaItemCollection - текущий плейлист!
надеюсь это поможет.