Wie lade ich Dateien aus der Windows Phone (8.1) Musikbibliothek mit Pfadnamen ab?

8

Ich lasse meinen Nutzern Dateien aus der Musikbibliothek auswählen. Danach speichere ich den Pfad der ausgewählten Dateien lokal. Jetzt ist mein Problem, wie bekomme ich programmatisch Zugriff auf die Dateien von diesen Pfaden? Hier sind ein paar Dinge, die ich versucht habe.

Sagen Sie, mein Pfadname ist D: \ Xyz \ abc.mp3

StorageFolder S = KnownFolders.MusicLibrary;

Alternative 1:

StorageFile MyFile = erwartet S.GetFileAsync ("abc.mp3"); // Datei nicht gefunden Fehler

// Ich denke, das funktioniert nicht, weil die GetFileAsync-Methode nur Dateien aus dem aktuellen Ordner

abrufen kann

Alternative 2:

S = erwartet S.GetFolderAsync ("Xyz"); // Nach dem ich GetFileAsync geplant habe. Aber dies gibt auch einen Ordner nicht gefunden Fehler.

Und schließlich habe ich versucht S = erwarten S.GetFolderAsync ("D");

Jede Hilfe, wie ich Zugriff auf die Datei bekomme oder sogar einen alternativen Weg, um mein Ziel zu erreichen, wäre fantastisch!

P.S: StorageFile.GetFileFromPathAsync ("D: \ Xyz \ abc.mp3") sagt, dass ich keine Zugriffsberechtigung habe.

    
Aditya 25.04.2014, 13:24
quelle

3 Antworten

10

(Beantworte die Wiederherstellung, um klarer zu werden)

Wenn Sie in package.appxmanifest file deklariert haben:

  • Music Library Fähigkeit in Fähigkeiten
  • File Type Association in Deklarationen (Ich bin mir nicht sicher, ob dies erforderlich ist, wenn Sie nur auf die Musikbibliothek zugreifen)

Dann können Sie Dateien aus Music Library Ordner wie folgt abrufen:

%Vor%

Um es zusammenzufassen: Sie können KnownFolders.MusicLibrary nur für Dateien freigeben, die sich entweder auf dem Telefon oder der SD-Karte befinden, aber im Musikordner - ihre Pfade sind dann:

  

C: \ Daten \ Benutzer \ Öffentlich \ Musik \ test.mp3 - für Telefon

     

D: \ Musik \ Test \ test2.mp3 - für SD-Karte

Denken Sie daran, dass der Zugriff über StorageFolder.GetFileAsync () möglich ist funktioniert relativ zum StorageFolder (es funktioniert auch mit vollem Pfad, siehe Bemerkung unten):

  

Der Name (oder Pfad relativ zum aktuellen Ordner) der abzurufenden Datei.

In diesem Fall werden die Dateinamen wie folgt verwendet: test.mp3 und Test\test2.mp3 .

Sie können keine anderen Dateien wie D:\xxx.mp3 abrufen - sie befinden sich nicht in der Musikbibliothek - sie befinden sich auf der SD-Karte, wenn Sie darauf zugreifen möchten, müssen Sie dies tun es von KnownFolders.RemovableDevices - wenn Sie die erforderlichen Funktionen hinzugefügt haben, dann Sie sollten in der Lage sein, über Vollpfad darauf zuzugreifen. Beachten Sie jedoch auch die Anmerkung

  

Verlassen Sie sich nicht auf diese Eigenschaft, um auf eine Datei zuzugreifen, da einige Dateien möglicherweise keine Dateisystempfade haben. Wenn beispielsweise die Datei von einem URI gesichert wird oder mit der Dateiauswahl ausgewählt wurde, ist nicht garantiert, dass die Datei über einen Dateisystempfad verfügt.

In unserer Diskussion haben wir herausgefunden, dass Sie CommonFileQuery.OrderByName verwenden, um Dateien zu erhalten. Wie ich dort nachgesehen habe (IMO) könnte das ein kleiner Bug sein - in der VS-Beschreibung heißt das:

  

Abfrageergebnisse für tiefe Abfragen umfassen alle Dateien in allen Unterordnern des abgefragten Ordners und sortieren sie basierend auf den angegebenen Metadaten.

Ausführen eines Stück Code:

%Vor%

hat resuls gegeben:

  • im ersten Fall 5 Dateien, die sich tatsächlich im Musikordner und seinen Unterordnern befinden,
  • im zweiten Fall - 14 Dateien in: Musikbibliothek, SD-Karte und Telefon

Sie können sich einfach den Path im Debug-Modus ansehen und Sie werden sehen, dass einige der Dateien in der zweiten Methode D:\file.mp3 haben und so weiter - sie sind nicht in der Musikbibliothek - also werden Sie nicht in der Lage sein Erhalte sie nach KnownFolders.MusicLibrary . Wenn Sie sie bekommen wollen, müssen Sie andere KnownFolders verwenden - in diesem Fall SD-Karte:

%Vor%     
Romasz 25.04.2014 14:34
quelle
2

Stellen Sie zunächst sicher, dass Sie über die richtigen Funktionen verfügen. Der Fehler, den Sie erhalten, ist der, den Sie sehen würden, wenn Sie nicht die richtige CAP_ID deklariert haben. Hier ist ein Screenshot:

In Bezug auf Dateipfade müssen Sie, abhängig davon, wo die Datei gespeichert ist, möglicherweise den doppelten Schrägstrich verwenden. Ich hatte ein ähnliches Problem, das ich mit folgendem Ansatz gelöst habe:

  

"isostore: shared \\ Ordnername \\ NameOfFile.mp3"

Sie können den gesamten Prozess in meine SO Post hier .

    
Lance McCarthy 25.04.2014 13:33
quelle
1

Sie sollten den Zugriffscache um den Zugriff auf die Dateien anstelle der Pfade zu speichern. Auf diese Weise können Sie StorageFile-Objekte abrufen, mit denen Sie sofort arbeiten können, und Sie können mit einigen Szenarios umgehen, die Dateien betreffen, die verschoben werden.

Um eine Datei im Zugriffscache zu speichern

%Vor%

Sie speichern das Token dann wo. Um die Datei aus dem Cache zurück zu bekommen:

%Vor%

Wenn Sie nur den Pfad speichern, werden Probleme mit Laufwerksbuchstaben usw. angezeigt. Dies stellt sicher, dass Ihre App sie erhalten kann, wenn die Datei noch verfügbar ist.

    
Adam 01.05.2014 20:47
quelle