Compartir a través de


Archivos y carpetas en las bibliotecas Música, Imágenes y Vídeos

Agregue carpetas existentes de música, imágenes o vídeos a las bibliotecas correspondientes. También puede quitar carpetas de bibliotecas, obtener la lista de carpetas de una biblioteca y detectar fotos almacenadas, música y vídeos.

Una biblioteca es una colección virtual de carpetas, que incluye una carpeta conocida de forma predeterminada, además de cualquier otra carpeta que el usuario haya agregado a la biblioteca mediante la aplicación o una de las aplicaciones integradas. Por ejemplo, la biblioteca Imágenes incluye la carpeta Imágenes conocidas de forma predeterminada. El usuario puede agregar carpetas o quitarlas de la biblioteca imágenes mediante la aplicación o la aplicación Fotos integrada.

Prerrequisitos

  • Comprender la programación asincrónica para aplicaciones para la Plataforma universal de Windows (UWP)

    Puede aprender a escribir aplicaciones asincrónicas en C# o Visual Basic, consulte Llamada a API asincrónicas en C# o Visual Basic. Para obtener información sobre cómo escribir aplicaciones asincrónicas en C++, consulte programación asincrónica en C++.

  • Permisos de acceso a la ubicación

    En Visual Studio, abra el archivo de manifiesto de la aplicación en el Diseñador de manifiestos. En la página Funcionalidades, seleccione las bibliotecas que administra la aplicación.

    • Biblioteca de música
    • Biblioteca de imágenes
    • Biblioteca de Vídeos

    Para obtener más información, consulte Permisos de Acceso a Archivos.

Obtener una referencia a una biblioteca

Nota:

Recuerde declarar la funcionalidad adecuada. Consulte declaraciones de funcionalidad de la aplicación para obtener más información.  

Para obtener una referencia a la biblioteca de música, imágenes o vídeo del usuario, llame al método StorageLibrary.GetLibraryAsync. Proporcione el valor correspondiente de la enumeración KnownLibraryId.

var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);

Obtener la lista de carpetas de una biblioteca

Para obtener la lista de carpetas de una biblioteca, obtenga el valor de la propiedad StorageLibrary.Folders.

using Windows.Foundation.Collections;
IObservableVector<Windows.Storage.StorageFolder> myPictureFolders = myPictures.Folders;

Obtener la carpeta en una biblioteca donde se guardan los nuevos archivos de forma predeterminada

Para obtener la carpeta en una biblioteca donde se guardan los nuevos archivos de forma predeterminada, obtenga el valor de la propiedad StorageLibrary.SaveFolder.

Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;

Agregar una carpeta existente a una biblioteca

Para agregar una carpeta a una biblioteca, puede llamar a la función StorageLibrary.RequestAddFolderAsync. Tomando la biblioteca de imágenes como ejemplo, llamar a este método hace que se muestre un selector de carpetas al usuario con un botón Agregar esta carpeta a Imágenes. Si el usuario elige una carpeta, la carpeta permanece en su ubicación original en el disco y se convierte en un elemento de la propiedad StorageLibrary.Folders (y en la aplicación Fotos integrada), pero la carpeta no aparece como elemento secundario de la carpeta Imágenes en el Explorador de archivos.

Windows.Storage.StorageFolder newFolder = await myPictures.RequestAddFolderAsync();

Quitar una carpeta de una biblioteca

Para quitar una carpeta de una biblioteca, llame al método StorageLibrary.RequestRemoveFolderAsync y especifique la carpeta que se va a quitar. Puede usar storageLibrary.Folders y un control ListView (o similar) para que el usuario seleccione una carpeta que se va a quitar.

Al llamar a StorageLibrary.RequestRemoveFolderAsync, el usuario ve un cuadro de diálogo de confirmación que indica que la carpeta "ya no aparecerá en Imágenes, pero no se eliminará". Esto significa que la carpeta permanece en su ubicación original en el disco, se quita de la propiedad StorageLibrary.Folders y ya no se incluirá en la aplicación Fotos integrada.

En el ejemplo siguiente se supone que el usuario ha seleccionado la carpeta que se va a quitar de un control listView denominado lvPictureFolders.

bool result = await myPictures.RequestRemoveFolderAsync(folder);

Recibir una notificación de los cambios en la lista de carpetas de una biblioteca

Para recibir notificaciones sobre los cambios en la lista de carpetas de una biblioteca, registre un controlador para el evento StorageLibrary.DefinitionChanged de la biblioteca.

myPictures.DefinitionChanged += MyPictures_DefinitionChanged;

void HandleDefinitionChanged(Windows.Storage.StorageLibrary sender, object args)
{
    // ...
}

Carpetas de la biblioteca multimedia

Un dispositivo proporciona cinco ubicaciones predefinidas para que los usuarios y las aplicaciones almacenen archivos multimedia. Las aplicaciones integradas almacenan los medios creados por el usuario y los medios descargados en estas ubicaciones.

Las ubicaciones son:

  • carpeta imágenes. Contiene imágenes.

    • carpeta Carrete de la Cámara. Contiene fotos y vídeo de la cámara integrada.

    • carpeta de imágenes guardadas. Contiene imágenes que el usuario ha guardado de otras aplicaciones.

  • carpeta Música. Contiene canciones, podcasts y libros de audio.

  • carpeta de video. Contiene vídeos.

Los usuarios o aplicaciones también pueden almacenar archivos multimedia fuera de las carpetas de la biblioteca multimedia en la tarjeta SD. Para buscar un archivo multimedia de forma confiable en la tarjeta SD, examine el contenido de la tarjeta SD o pida al usuario que busque el archivo mediante un selector de archivos. Para obtener más información, consulta Acceder a la tarjeta SD.

Consulta de las bibliotecas multimedia

Para obtener una colección de archivos, especifique la biblioteca y el tipo de archivos que desee.

using Windows.Storage;
using Windows.Storage.Search;

private async void getSongs()
{
    QueryOptions queryOption = new QueryOptions
        (CommonFileQuery.OrderByTitle, new string[] { ".mp3", ".mp4", ".wma" });

    queryOption.FolderDepth = FolderDepth.Deep;

    Queue<IStorageFolder> folders = new Queue<IStorageFolder>();

    var files = await KnownFolders.MusicLibrary.CreateFileQueryWithOptions
      (queryOption).GetFilesAsync();

    foreach (var file in files)
    {
        // do something with the music files
    }
}

Los resultados de la consulta incluyen almacenamiento interno y extraíble

Los usuarios pueden elegir almacenar archivos de forma predeterminada en la tarjeta SD opcional. Sin embargo, las aplicaciones pueden no permitir que los archivos se almacenen en la tarjeta SD. Como resultado, las bibliotecas multimedia se pueden dividir entre el almacenamiento interno del dispositivo y la tarjeta SD.

No es necesario escribir código adicional para controlar esta posibilidad. Los métodos del Windows.Storage espacio de nombres que consultan carpetas conocidas combinan de forma transparente los resultados de la consulta de ambas ubicaciones. No es necesario especificar la funcionalidad extraíbleStorage en el archivo de manifiesto de la aplicación para obtener estos resultados combinados, tampoco.

Tenga en cuenta el estado del almacenamiento del dispositivo que se muestra en la imagen siguiente:

imágenes en el teléfono y la tarjeta sd

Si consulta el contenido de la biblioteca de imágenes llamando a await KnownFolders.PicturesLibrary.GetFilesAsync(), los resultados incluyen internalPic.jpg y SDPic.jpg.

Trabajar con fotos

En los dispositivos en los que la cámara guarda una imagen de baja resolución y una imagen de alta resolución de cada imagen, las consultas profundas devuelven solo la imagen de baja resolución.

El rollo de cámara y la carpeta Imágenes guardadas no admiten las consultas profundas.

Abrir una foto en la aplicación que lo capturó

Si desea permitir que el usuario vuelva a abrir una foto más adelante en la aplicación que la capturó, puede guardar el CreatorAppId con los metadatos de la foto mediante código similar al ejemplo siguiente. En este ejemplo, testPhoto es un StorageFile.

IDictionary<string, object> propertiesToSave = new Dictionary<string, object>();

propertiesToSave.Add("System.CreatorOpenWithUIOptions", 1);
propertiesToSave.Add("System.CreatorAppId", appId);

testPhoto.Properties.SavePropertiesAsync(propertiesToSave).AsyncWait();   

Uso de métodos de secuencia para agregar un archivo a una biblioteca multimedia

Al acceder a una biblioteca multimedia mediante una carpeta conocida, como KnownFolders.PictureLibrary, y utilizar métodos de flujo para agregar un archivo a la biblioteca multimedia, debe asegurarse de cerrar todos los flujos que abre el código. De lo contrario, estos métodos no pueden agregar el archivo a la biblioteca multimedia como se esperaba porque al menos una secuencia todavía tiene un identificador para el archivo.

Por ejemplo, al ejecutar el código siguiente, el archivo no se agrega a la biblioteca multimedia. En la línea de código, using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)), tanto el método OpenAsync como el método GetOutputStreamAt abren un flujo. Sin embargo, solo se elimina la secuencia abierta por el método GetOutputStreamAt como resultado de la mediante la instrucción. La otra corriente permanece abierta e impide guardar el archivo.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");
using (var sourceStream = (await sourceFile.OpenReadAsync()).GetInputStreamAt(0))
{
    using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))
    {
        await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
    }
}

Para usar los métodos de secuencia correctamente para agregar un archivo a la biblioteca multimedia, asegúrese de cerrar todas las secuencias que abre el código, como se muestra en el ejemplo siguiente.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");

using (var sourceStream = await sourceFile.OpenReadAsync())
{
    using (var sourceInputStream = sourceStream.GetInputStreamAt(0))
    {
        using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0))
            {
                await RandomAccessStream.CopyAndCloseAsync(sourceInputStream, destinationStream);
            }
        }
    }
}