Selector de archivos
En este artículo se describe cómo puedes usar la interfaz IFilePicker
de .NET Multi-platform App UI (.NET MAUI). Con la interfaz IFilePicker
, puedes pedir al usuario que elija uno o varios archivos del dispositivo.
La implementación predeterminada de la interfaz IFilePicker
está disponible a través de la propiedad FilePicker.Default
. Tanto la interfaz IFilePicker
como la clase FilePicker
están contenidas en el espacio de nombres Microsoft.Maui.Storage
.
Introducción
Para acceder a la funcionalidad de FilePicker, se requiere la siguiente configuración específica para la plataforma.
Si la aplicación está destinada a Android 12 o inferior, debes solicitar el permiso READ_EXTERNAL_STORAGE
. Si la aplicación está destinada a Android 13 o superior y necesita acceso a los archivos que otras aplicaciones han creado, debes solicitar uno o varios de los siguientes permisos granulares en lugar del permiso READ_EXTERNAL_STORAGE
:
READ_MEDIA_IMAGES
READ_MEDIA_VIDEO
READ_MEDIA_AUDIO
Estos permisos se pueden agregar de la siguiente manera:
Agrega el permiso basado en ensamblados:
Abre el archivo Platforms/Android/MainApplication.cs y agrega los siguientes atributos de ensamblado después de las directivas
using
:[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage, MaxSdkVersion = 32)] [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaAudio)] [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaImages)] [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaVideo)]
O bien
Actualiza el manifiesto de Android:
Abre el archivo Platforms/Android/AndroidManifest.xml y agrega esto en el nodo
manifest
:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Required only if your app needs to access images or photos that other apps created --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- Required only if your app needs to access videos that other apps created --> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- Required only if your app needs to access audio files that other apps created --> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
O bien
Actualiza el manifiesto de Android en el editor de manifiestos:
En Visual Studio, haz doble clic en el archivo Platforms/Android/AndroidManifest.xml para abrir el editor de manifiestos de Android. Luego, comprueba los permisos enumerados arriba en Permisos necesarios. Esto actualizará automáticamente el archivo AndroidManifest.xml.
Importante
Se debe llamar a todos los métodos del subproceso de interfaz de usuario porque .NET MAUI controla automáticamente las solicitudes y comprobaciones de permisos.
Selección de un archivo
El método PickAsync
solicita al usuario que elija un archivo del dispositivo. Usa el tipo PickOptions
para especificar los tipos de archivo y título permitidos con el selector. En el ejemplo siguiente se muestra cómo abrir el selector y procesar la imagen seleccionada:
public async Task<FileResult> PickAndShow(PickOptions options)
{
try
{
var result = await FilePicker.Default.PickAsync(options);
if (result != null)
{
if (result.FileName.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) ||
result.FileName.EndsWith("png", StringComparison.OrdinalIgnoreCase))
{
using var stream = await result.OpenReadAsync();
var image = ImageSource.FromStream(() => stream);
}
}
return result;
}
catch (Exception ex)
{
// The user canceled or something went wrong
}
return null;
}
Los tipos de archivo predeterminados se proporcionan con FilePickerFileType.Images
, FilePickerFileType.Png
y FilePickerFilerType.Videos
. Puedes especificar tipos de archivo personalizados por plataforma mediante la creación de una instancia de la clase FilePickerFileType
. El constructor de esta clase toma un diccionario con clave por el tipo DevicePlatform
para identificar la plataforma. El valor de la clave del diccionario es una colección de cadenas que representan los tipos de archivo. Por ejemplo, aquí se muestra cómo especificarías determinados tipos de archivo de cómic:
var customFileType = new FilePickerFileType(
new Dictionary<DevicePlatform, IEnumerable<string>>
{
{ DevicePlatform.iOS, new[] { "public.my.comic.extension" } }, // UTType values
{ DevicePlatform.Android, new[] { "application/comics" } }, // MIME type
{ DevicePlatform.WinUI, new[] { ".cbr", ".cbz" } }, // file extension
{ DevicePlatform.Tizen, new[] { "*/*" } },
{ DevicePlatform.macOS, new[] { "cbr", "cbz" } }, // UTType values
});
PickOptions options = new()
{
PickerTitle = "Please select a comic file",
FileTypes = customFileType,
};
La búsqueda de archivos en función del tipo de archivo puede ser diferente de una plataforma a la otra. Para obtener más información, consulta Diferencias entre plataformas.
Selección de varios archivos
Si deseas que el usuario elija varios archivos, puedes llamar al método FilePicker.PickMultipleAsync
. Este método también toma un parámetro PickOptions
para especificar información adicional. Los resultados son los mismos que PickAsync
, pero en lugar del tipo FileResult
devuelto, se devuelve un tipo IEnumerable<FileResult>
con todos los archivos seleccionados.
Sugerencia
La propiedad FullPath no siempre devuelve la ruta de acceso física al archivo. Para obtener el archivo, use el método OpenReadAsync.
Diferencias entre plataformas
En esta sección se describen las diferencias específicas de la plataforma con el selector de archivos.
PickOptions.PickerTitle
se muestra en la solicitud inicial al usuario, pero no en el propio cuadro de diálogo del selector.
Al filtrar archivos por tipo, usa el tipo MIME del archivo. Para obtener una lista de los tipos MIME, consulta Mozilla - Lista completa de tipos MIME.