2012-04-10 5 views
9

Ich möchte programmatisch Warteschlange in native Music App gespielt werden. Ich kann MPMusicPlayerController verwenden, um zur Zeit spielen Element, aber ich möchte nicht nur das Element, sondern ganze Warteschlange zu bekommen. Ist es möglich, es mit AVFoundation oder einer anderen Bibliothek zu tun?iOS - programmatisch Queue von Elementen, die gerade spielen

Vielen Dank

+1

Ich bin mir sicher, dass dies möglich ist. "Ecoute" im App Store ruft irgendwie programmatisch die aktuelle Warteschlange ab, und das hat nichts damit zu tun, die Warteschlange in der App zu verwalten. Für z.B. Beende die App vollständig, gehe in die Musik-App und erstelle eine Playlist mit ein paar Titeln und spiele sie ab. Gehen Sie dann zurück in die App auf den Bildschirm, der gerade abgespielt wird, und tippen Sie auf das Uhrsymbol oben rechts, um die Warteschlange anzuzeigen. Sie werden sehen, dass sich alle Titel in dieser Wiedergabeliste in der Warteschlange befinden. Woher weiß es, welche Playlist? Verwenden sie nicht dokumentierte APIs? – sooper

+0

@sooper Ich denke, dass sie undokumentierte APIs verwenden. Siehe meine Antwort unten. – bugloaf

Antwort

2

Ich fürchte, das ist nicht möglich. Apple gewährt uns aus irgendwelchen Bibliotheken keinen Zugriff auf diese Informationen.

-2

Ich habe das untersucht und plötzlich erkannt, wie einfach es ist!

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

mediaItemCollection ist die aktuelle Wiedergabeliste!

hoffe das hilft.

+0

Das ist falsch. mediaItemCollection ist eine MPMediaItemCollection, die durch die Auswahl in MPMediaPickerController generiert wird. Dies ist eine neue Liste von Songs, die an Ort und Stelle generiert wurden und nichts mit den aktuell spielenden Titeln in der iPod App zu tun haben. –

+0

@ 0x7fffffff wollte nur fragen, ob Sie irgendwelche Gedanken zu meinem Kommentar auf dem OP geschrieben hatten? – sooper

6

Ich bin mir ziemlich sicher, dass dies nicht durch eine öffentliche API möglich ist. Die Ecoute-App, die von @sooper erwähnt wird, muss private APIs verwenden. Ich habe ein kleines Experiment in der Codebasis meiner eigenen Musik-App gemacht. Zuerst habe ich diesen Code alle Methoden in der iPod-Musik-Player zur Liste (Put #import <objc/runtime.h> am oberen Rand):

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); 

Das stellte einige interessante Methode Namen wie numberOfItems und nowPlayingItemAtIndex: auf. Also habe ich diese Kategorie am Anfang der Datei:

@interface MPMusicPlayerController (Private) 

- (NSInteger)numberOfItems; 
- (MPMediaItem*)nowPlayingItemAtIndex:(NSInteger)index; 

@end 

und ich lief diesen Code:

NSInteger numberOfItems = [[MPMusicPlayerController iPodMusicPlayer] numberOfItems]; 
for (NSInteger i = 0; i < numberOfItems; i++) { 
    MPMediaItem* mi = [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItemAtIndex:i]; 
    NSLog(@"%@", [mi valueForProperty:MPMediaItemPropertyTitle]); 
} 

und sicher genug, gedruckt es die Playlist, die ich hatte in der Musik-App Warteschlange gestellt !

Natürlich, wenn Sie diese Methoden auf diese Weise aufrufen, wird Apple Ihre App ablehnen, aber es gibt einen Weg zu hide private API calls from Apple.

+0

Danke für die Antwort, es scheint, dass die Funktionalität seit meiner letzten Kommentierung aus der betreffenden App entfernt wurde. – sooper

Verwandte Themen