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í .