sincroniza reproductor reconoce para musica mejor groove escuchar encuentra windows windows-phone windows-phone-8.1

reproductor - ¿Cómo recuperar archivos de la biblioteca de música de Windows phone(8.1) usando nombres de ruta?



groove no reconoce mi musica (3)

Estoy dejando que mis usuarios seleccionen archivos de la biblioteca de música. Después de lo cual estoy almacenando la ruta de los archivos seleccionados localmente. Ahora mi problema es ¿cómo obtengo acceso a los archivos programáticamente desde estas rutas? Aquí hay un par de cosas que he intentado.

Digamos que mi ruta es D: / Xyz / abc.mp3

StorageFolder S = KnownFolders.MusicLibrary;

Alternativa 1:

StorageFile MyFile = aguarde S.GetFileAsync ("abc.mp3"); // Error de archivo no encontrado

// Me imagino que esto no funciona porque el método GetFileAsync solo puede obtener archivos de la carpeta actual

Alternativa 2:

S = aguardar S.GetFolderAsync ("Xyz"); // Después de lo cual planeé hacer GetFileAsync. Pero esto también da un error de carpeta no encontrada.

Y finalmente probé S = aguardar S.GetFolderAsync ("D");

Cualquier ayuda sobre cómo acceder al archivo o incluso una forma alternativa de lograr mi objetivo sería fantástico.

PD: StorageFile.GetFileFromPathAsync ("D: / Xyz / abc.mp3") dice que no tengo permiso para acceder.


(Respuesta de reconstrucción para ser más claro)

Si ha declarado en el archivo package.appxmanifest :

  • Capacidad de la Music Library en Capacidades
  • File Type Association in Declarations (No estoy seguro si esto es necesario si solo accede a Music Library)

entonces podrá recuperar archivos de la carpeta Music Library esta manera:

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

Para resumir, KnownFolders.MusicLibrary solo KnownFolders.MusicLibrary a los archivos que están en el teléfono o en la tarjeta SD, pero en la carpeta Música; sus rutas serán entonces:

C: / Data / Users / Public / Music / test.mp3 - para teléfono

D: / Music / Test / test2.mp3 - para tarjeta SD

Recuerde que el acceso mediante StorageFolder.GetFileAsync () funciona en relación con StorageFolder (también funcionará con la ruta completa, consulte la observación a continuación):

El nombre (o ruta relativa a la carpeta actual) del archivo a recuperar.

En este caso, para obtener los archivos anteriores, usará nombres de archivo como: test.mp3 y Test/test2.mp3 .

No podrá obtener otros archivos como D:/xxx.mp3 - no está en la Biblioteca de música - está en la tarjeta SD, si desea acceder tendrá que hacerlo por KnownFolders.RemovableDevices - cuando ha agregado las capacidades requeridas, entonces debería poder acceder a eso a través de la ruta completa. Pero también por favor recuerda acerca de la observación:

No confíe en esta propiedad para acceder a un archivo porque algunos archivos pueden no tener rutas de sistema de archivos. Por ejemplo, si el archivo está respaldado por un URI, o se seleccionó utilizando el selector de archivos, no se garantiza que el archivo tenga una ruta del sistema de archivos.

En nuestra discusión se explica que está utilizando CommonFileQuery.OrderByName para obtener archivos. Como he comprobado allí (IMO) podría ser un pequeño error, en VS la descripción dice que:

Los resultados de consulta para consultas profundas incluyen todos los archivos en todas las subcarpetas de la carpeta que se está consultando y los ordena en función de los metadatos especificados.

Ejecutando un pice de código:

// 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 dado resuls:

  • en primer caso, 5 archivos que están de hecho en la carpeta Música y sus subcarpetas,
  • en el segundo caso - 14 archivos que se encuentran en: Biblioteca de música, Tarjeta SD y Teléfono

Puede mirar fácilmente la Path en el modo de depuración y verá que algunos de los archivos en el segundo método tienen D:/file.mp3 y demás - no están en la Biblioteca de música - por lo que no podrá obtenerlos por KnownFolders.MusicLibrary . Si desea obtenerlos, deberá utilizar otros KnownFolders, en este caso la tarjeta 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


Querrá utilizar el caché de acceso para almacenar el acceso a los archivos en lugar de las rutas. Esto le permitirá recuperar objetos StorageFile con los que puede trabajar de inmediato, y le ayudará con algunos escenarios que rodean los archivos que se mueven.

Para almacenar un archivo en el caché de acceso

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

A continuación, guarde el token en algún lugar. Para recuperar el archivo de la memoria caché:

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

Almacenar solo el camino lo abre a problemas con letras de unidad que cambian ect. Esto garantiza que si el archivo aún está disponible, su aplicación puede obtenerlo.


Primero, asegúrese de tener las capacidades correctas establecidas. El error que está recibiendo es lo que vería si no declarase el CAP_ID correcto. Aquí hay una captura de pantalla:

En cuanto a las rutas de archivos, dependiendo de dónde esté almacenado el archivo, es posible que deba usar la barra doble. Tuve un problema similar, lo resolví utilizando el siguiente enfoque:

"isostore: shared // folderName // NameOfFile.mp3"

Puedes ver todo el proceso en mi publicación SO aquí .