En el artículo anterior se ha visto cómo se consumían ficheros desde una aplicación Metro, en este se verá cómo convertir una aplicación existente en un origen de datos para otras aplicaciones
Proporcionando ficheros
La otra cara de trabajar con ficheros permite a nuestras aplicaciones proporcionar archivos directamente de los servicios a los que estén conectados.
¿Qué aplicaciones deberían implementarlo?
En general, cualquier aplicación que trabaje con ficheros, entre las que se puede mencionar, como ejemplo:
- Redes sociales, para obtener fotos o vídeo directamente.
- Programas que reciban RSS de vídeo, música o imágenes.
- Gestores de tareas que almacenen, para cada proyecto, ficheros.
- Blocs de notas, etc…
Implementación
Para que la aplicación desarrollada que nuestra aplicación tenga esta funcionalidad, debe incluir el contrato Picker, que se agrega en la ventana Project > Add New Item… :
Una vez agregado, es necesario configurar, como se ha visto en el artículo dedicado al contrato Share, la opción Supported File Types en el fichero .appxmanifest. Esta opción permitirá limitar a qué tipo de ficheros accederán las otras aplicaciones.
Una vez hecho esto, se habrá creado una plantilla similar a la de compartir. La diferencia es que todo el manejo de ficheros y la interfaz tendrá que ir por nuestra cuenta, mientras respetemos los elementos comunes de la interfaz.
El objeto más importante para poder proporcionar ficheros es el objeto FilePickerBasket, que servirá como enlace común.al resto de las aplicaciones.
Para poder agregar ficheros al Basket se usará un código similar en el caso de que la ruta al fichero sea local:
StorageFile pickedFile = await Package.Current.InstalledLocation.GetFileAsync(@"ruta\al\fichero"); this.AddFileToBasket("Fichero local", pickedFile);
En el caso de que el fichero se encuentre en un servidor remoto, será necesario que el servicio asociado proporcione una URL para poder acceder a él, y el propio sistema se encargará de descargarlo y asociarlo a la aplicación que lo requiera.
StorageFile pickedUriFile = await StorageFile.GetFileFromUriAsync(uri, filename, StreamReference.CreateFromUri("http://ruta/al/fichero")); this.AddFileToBasket("Fichero remoto", pickedUriFile);
La última línea cargará el siguiente código auxiliar, válido tanto para ficheros locales como remotos.
void AddFileToBasket(string id, StorageFile file) { bool inBasket; switch (this.basket.AddFile(id, file)) { case AddFileToBasketResult.AddedToBasket: case AddFileToBasketResult.AlreadyInBasket: inBasket = true; break; default: inBasket = false; break; } this.UpdateSelectionState(id, inBasket); }
Para eliminar un fichero del Basket el código sería este, válido tanto para un fichero local como para un fichero remoto:
id = "Nombre del fichero"; if (this.basket.ContainsFile(id)) { this.basket.RemoveFile(id); }
Conclusiones
Las nuevas maneras de consumir y proporcionar ficheros de las aplicaciones Metro permite, al igual que como se veía en los artículos dedicados a las opciones de compartir, llegar a un nuevo nivel de interacción entre diferentes aplicaciones y con el propio sistema.
Serán los propios usuarios, quienes descubran nuevas maneras de combinar las aplicaciones existentes usando estos nuevos servicios, creando una nueva experiencia en el uso de sus ordenadores personales.
Más información
- En este blog: El contrato Share
- MSDN: File picker app extension sample
- MSDN: FilePickerBasket
- MSDN: Quickstart: Make your app’s content accessible through the file picker