c# - Compruebe si el usuario agregó nueva música en Windows Phone 8.1
windows-8 windows-8.1 (3)
Puede verificar el tamaño de la carpeta en su lugar:
ulong musicFolderSize = (ulong)ApplicationData.Current.LocalSettings.Values["musicFolderSize"];
BasicProperties props = await KnownFolders.MusicLibrary.GetBasicPropertiesAsync();
if (props.Size != musicFolderSize)
{
// ...
ApplicationData.Current.LocalSettings.Values["musicFolderSize"] = props.Size;
}
Estoy tratando de averiguar si un usuario agregó música nueva a la carpeta Música en el teléfono desde la última vez que se utilizó la aplicación.
Intento hacerlo marcando la carpeta DateModified of the Music (que se actualiza correctamente en la computadora al agregar nueva música al teléfono):
async void GetModifiedDate ()
{
BasicProperties props = await KnownFolders.MusicLibrary.GetBasicPropertiesAsync();
Debug.WriteLine("DATEMODIFIED: " + props.DateModified.ToString());
}
Lamentablemente esto vuelve:
DATEMODIFIED: 1/1/1601 1:00:00 AM +01:00
¿Estoy haciendo algo mal o hay otra forma rápida de verificar si el usuario agregó nueva música?
Agregando a la respuesta de Romansz:
La única manera de garantizar que sabe de un cambio de archivo sería realizar un seguimiento de los archivos en el dispositivo y luego comparar si hay un cambio entre los lanzamientos.
Una forma más lenta de obtener todos los archivos sería usar KnownFolders.MusicLibrary.GetFilesAsync(CommonFileQuery.OrderByName);
que es una consulta profunda por defecto. Capturará todos los archivos en una consulta, pero puede ser realmente lento en directorios masivos. A continuación, debe recorrer todos los archivos como se muestra
//cache the virtual storage folder for the loop
StorageFolder musicLibrary = KnownFolders.MusicLibrary;
uint stepSize= 50;
uint startIndex = 0;
while (true)
{
IReadOnlyList<StorageFile> files = await musicLibrary.GetFilesAsync(CommonFileQuery.OrderByName,startIndex,stepSize);
foreach (var file in files)
{
//compare to see if file is in your list
}
if (files.Count < stepSize) break;
startIndex += stepSize;
}
KnownFolders.MusicLibrary es una ubicación virtual . Por lo tanto, creo que puede haber un problema para obtener sus propiedades.
El otro problema es que DateModified
puede ser una mala idea, ya que puede permanecer igual cuando el usuario agrega un archivo. No puedes retransmitirlo. ( alguna información ). Puede verificarlo: cuando intenté mover archivos en carpetas, su DateModified
no había cambiado.
Entonces, en este caso, me temo que tendrá que listar sus archivos en MusicLibrary y luego decidir qué guardar para futuras comparaciones. La suma de tamaños de archivos puede ser una buena idea, por lo tanto, hay pocas posibilidades de que dos archivos de música diferentes tengan el mismo tamaño. También depende si desea que se le notifique si el usuario movió el archivo de una carpeta a otra (el tamaño total no cambiará). Si desea asegurarse más, puede recordar la lista completa de Tuple<file.FolderRelativeId, fileSize>
(para ecample).
Como FileQueries aún no está disponible para Windows Phone, tendrá que recuperar los archivos recursivamente, el código simple puede verse así:
// first - a method to retrieve files from folder recursively
private async Task RetriveFilesInFolder(List<StorageFile> list, StorageFolder parent)
{
foreach (var item in await parent.GetFilesAsync()) list.Add(item);
foreach (var item in await parent.GetFoldersAsync()) await RetriveFilesInFolder(list, item);
}
private async Task<List<StorageFile>> GetFilesInMusic()
{
StorageFolder folder = KnownFolders.MusicLibrary;
List<StorageFile> listOfFiles = new List<StorageFile>();
await RetriveFilesInFolder(listOfFiles, folder);
return listOfFiles;
}
Una vez que tenga una lista de sus archivos, puede decidir qué recordar para una mayor comparación en el próximo lanzamiento de la aplicación.