2014-04-25 12 views
8

Sto permettendo agli utenti di selezionare i file dalla libreria musicale. Dopo di che sto memorizzando localmente il percorso dei file selezionati. Ora il mio problema è come ottengo l'accesso ai file a livello di programmazione da questi percorsi? Ecco un paio di cose che ho provato.Come recuperare i file dalla libreria musicale Windows Phone (8.1) utilizzando i nomi dei percorsi?

Dire il mio percorso è D: \ Xyz \ abc.mp3

StorageFolder S = KnownFolders.MusicLibrary;

Alternativa 1:

StorageFile MyFile = attendere S.GetFileAsync ("abc.mp3"); // File non trovato errore

// Immagino che questo non funziona causa metodo GetFileAsync può ottenere solo i file dalla cartella corrente

Alternativa 2:

S = attendono S.GetFolderAsync ("XYZ"); // Dopo di che ho pianificato di eseguire GetFileAsync. Ma questo dà anche un errore non trovato nella cartella.

E infine ho provato S = attendo S.GetFolderAsync ("D");

Qualsiasi aiuto su come ottenere l'accesso al file o anche un modo alternativo per raggiungere il mio obiettivo sarebbe fantastico!

P.S: StorageFile.GetFileFromPathAsync ("D: \ Xyz \ abc.mp3") dice che non ho il permesso di accesso.

+0

GetFileFromPathAsync non garantisce il mantenimento dell'accesso ai file da un selettore su Windows Phone 8.1. L'accesso negato è il risultato previsto. Per mantenere l'accesso sarà necessario utilizzare lo spazio dei nomi Windows.Storage.AccessCache. Vedi la mia risposta per un modo per mantenere l'accesso a un file. – Adam

risposta

2

Innanzitutto, assicurarsi di disporre delle funzionalità appropriate. L'errore che ottieni è quello che vedresti se non dichiarassi il CAP_ID corretto. Ecco uno screenshot:

enter image description here

Per quanto riguarda i percorsi di file, a seconda di dove è memorizzato il file, potrebbe essere necessario utilizzare il doppio-slash. Ho avuto un problema simile, ho risolto utilizzando il seguente approccio:

"isostore: condivisa \\ nomeCartella \\ NameOfFile.mp3"

Si può vedere l'intero processo in my SO post here.

+0

È un'app wp 8.1 e ho la capacità di Music Library selezionata. Sto recuperando tutti i file dalla libreria e permettendo agli utenti di selezionarli. Quindi sto memorizzando i percorsi dei file, fino ai quali va bene. Ora voglio accedere a quei file più avanti nella mia app. E sì doppio taglio, sempre lo stesso. – Aditya

10

(Risposta ricostruire per essere più chiari)

Se aveva dichiarato in package.appxmanifest di file:

  • Music Library capacità in Capabilities
  • File Type Association in Dichiarazioni (non sono sicuro se ciò è necessario se si accede solo alla Libreria musicale)

allora si sarà in grado di recuperare i file dalla cartella Music Library come questo:

StorageFolder folder = KnownFolders.MusicLibrary; 
// below code will work unless 'fileName.mp3' is in 
// your Music folder either on phone or SD card 
StorageFile file = await folder.GetFileAsync("fileName.mp3"); 
// you can access them also with path, but in this case 
// also Folders must be in Music folder 
string path = @"Test\ccc.mp3"; 
StorageFile file = await folder.GetFileAsync(path); 

Riassumendo si sarà in grado di Aceess da KnownFolders.MusicLibrary solo ai file che sono o sul telefono o nella scheda SD, ma nella cartella Musica - i loro percorsi saranno quindi:

C: \ Data \ Users \ Public \ Musica \ test.mp3 - per il telefono

D: Musica \ test \ test2.mp3 \ - per SD card

Ricordate che l'accesso da StorageFolder.GetFileAsync() funziona relativa al StorageFolder (funzionerà anche con il percorso completo, vedi osservazione sotto):

Il nome (o il percorso relativo alla cartella corrente) del file recuperare.

In questo caso per ottenere i file di cui sopra si intende utilizzare nomi di file come: test.mp3 e Test\test2.mp3.

È non sarà in grado di ottenere altri file come D:\xxx.mp3 - non è nella Music Library - è su scheda SD, se si vuole accedervi dovrete farlo da KnownFolders.RemovableDevices - quando hanno aggiunto le funzionalità richieste, quindi dovresti essere in grado di accedervi tramite fullpath. Ma anche please remember about the remark:

Non fare affidamento su questa proprietà per accedere a un file perché alcuni file potrebbero non avere percorsi del file system. Ad esempio, se il file è supportato da un URI o è stato selezionato utilizzando il selettore di file, non è garantito che il file abbia un percorso del file system.

Nella nostra discussione spiegata che si sta utilizzando CommonFileQuery.OrderByName per ottenere i file. Come ho controllato lì (IMO) potrebbe essere un piccolo bug - nella descrizione VS dice che:

I risultati delle query per le query profondi comprendono tutti i file in tutte le sottocartelle della cartella interrogato e le ordina in base ai metadati specificati.

Esecuzione di una pice di codice:

// a method to retrieve files from Musiic Library recursively 
private async Task RetriveFilesInFolders(List<StorageFile> list, StorageFolder parent) 
{ 
    foreach (var item in await parent.GetFilesAsync()) list.Add(item); 
    foreach (var item in await parent.GetFoldersAsync()) await RetriveFilesInFolders(list, item); 
} 

// then I've used it like this: 

StorageFolder folder = KnownFolders.MusicLibrary; 

List<StorageFile> listOfFiles = new List<StorageFile>(); 
await RetriveFilesInFolders(listOfFiles, folder); 
// as a result of above code I have a List of 5 files that are in Music Library 

List<IStorageItem> filesFolders = (await folder.GetItemsAsync()).ToList(); 
List<StorageFile> items = (await folder.GetFilesAsync(CommonFileQuery.OrderByName)).ToList(); 
// as a result here I've 14 files that are in Music Library and SD card, and Phone 

ha dato resuls:

  • nel primo caso 5 file che si trovano di fatto nella cartella Musica e relative sottocartelle,
  • in seconda caso - 14 file presenti in: libreria musicale, scheda SD e telefono

Puoi facilmente guardare lo Path in modalità di debug e vedrai che alcuni file nel secondo metodo hanno D:\file.mp3 e così via - non sono nella libreria musicale - quindi non sarai in grado di ottenerli per KnownFolders.MusicLibrary. Se si desidera ottenere loro allora si dovrà utilizzare altri KnownFolders - in questo caso la scheda SD:

StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices; 
StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault(); 
StorageFile file = await sdCard.GetFileAsync("xyz.mp3"); // for D:\xyz.mp3 
StorageFile file = await sdCard.GetFileAsync("XYZ\xyz.mp3"); // for D:\XYZ\xyz.mp3 
+0

Ho la capacità della libreria musicale spuntata. Sto recuperando tutti i file dalla libreria e permettendo agli utenti di selezionarli. Quindi sto memorizzando i percorsi dei file, fino ai quali va bene. Ora voglio accedere a quei file più avanti nella mia app. E come ho detto StorageFile file = attendi cartella.GetFileAsync ("fileName.mp3"); non funziona. E sono fiducioso che un tale file esiste nella libreria perché ho recuperato il nome dagli oggetti StorageFile selezionati dal mio utente. Un modo semplice sarebbe fare GetFilesAsync (Query) ogni volta e cercare il mio file nel risultato. Ma questo porterebbe a prestazioni terribili. – Aditya

+0

@Aditya Penso che non dovresti usare 'Path', ma' Name' e Parent Folder. Guarda che 'StorageFolder folder = KnownFolders.MusicLibrary' ti dà accesso a Music Library - dovresti ottenere GetFiles relativo. Non sono sicuro che ricordare Path o Name sia un buon modo - guarda che Music Lib può essere su SD Card e nella memoria Phones, l'utente può scambiare file tra loro. Dovresti anche controllare se l'utente non ha cancellato il file. – Romasz

+0

Hanno provato ad usare anche il nome, non funziona. E nessuna cancellazione, la situazione delle mosse sta accadendo perché lo sto facendo nel mio telefono/emulatore. – Aditya

1

Si vuole utilizzare la access cache per memorizzare l'accesso ai file, invece dei percorsi. Questo ti permetterà di recuperare oggetti StorageFile su cui puoi lavorare subito e aiuterà con alcuni scenari che riguardano i file che vengono spostati.

Per memorizzare un file nella cache di accesso

StorageFile file; //Get a file 
string mruToken = Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList.Add(file, "20120716"); 

Quindi si salva il token alcuni dove. Per ottenere il file indietro dalla cache:

StorageFile file = await Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList.getFileAsync(mruToken); 

Memorizzazione solo il percorso che si apre a problemi con le lettere di unità cambiare ect. Questo assicura che se il file è ancora disponibile, la tua app può ottenerlo.

Problemi correlati