Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Examinar ejemplo. Examinar el ejemplo
En este artículo se describe cómo puedes usar la interfaz .NET Multi-platform App UI (.NET MAUI). Esta interfaz permite al usuario elegir o tomar una foto o un vídeo en el dispositivo.
La implementación predeterminada de la interfaz IMediaPicker está disponible a través de la propiedad MediaPicker.Default. Tanto la interfaz IMediaPicker como la clase MediaPicker están contenidas en el espacio de nombres Microsoft.Maui.Media.
Comenzar
Para acceder a la función del selector de archivos multimedia, se requiere la siguiente configuración específica para la plataforma:
- Android
- iOS/Mac Catalyst
- Windows
El permiso CAMERA es necesario y se debe configurar en el proyecto Android. Además:
Si tu aplicación está dirigida a Android 12 o inferior, debes solicitar los permisos
y . Si la aplicación tiene como destino Android 13 o superior y necesita acceso a los archivos multimedia que otras aplicaciones han creado, debes solicitar uno o varios de los siguientes permisos multimedia granulares en lugar del permiso `
READ_EXTERNAL_STORAGE`:READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO
Estos permisos se pueden agregar de la siguiente manera:
Agrega los permisos basados en ensamblados:
Abre el archivo Platforms/Android/MainApplication.cs y agrega los siguientes atributos de ensamblado después de las directivas
using:// Needed for Picking photo/video [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)] // Needed for Taking photo/video [assembly: UsesPermission(Android.Manifest.Permission.Camera)] [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage, MaxSdkVersion = 32)] // Add these properties if you would like to filter out devices that do not have cameras, or set to false to make them optional [assembly: UsesFeature("android.hardware.camera", Required = true)] [assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]-o-
Actualiza el manifiesto de Android:
Abre el archivo Platforms/Android/AndroidManifest.xml y agrega lo siguiente en el nodo
manifest.<!-- Needed for Picking photo/video --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- Needed for Taking photo/video --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Add these properties if you would like to filter out devices that do not have cameras, or set to false to make them optional --> <uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="true" />-o-
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.
Si la versión objetivo de Android del proyecto se establece en Android 11 (R API 30) o superior, debes actualizar tu Manifiesto de Android con las consultas que utilizan los requisitos de visibilidad de paquetes de Android.
En el archivo Platforms/Android/AndroidManifest.xml, agrega los siguientes nodos queries/intent en el nodo manifest:
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
Uso del selector de archivos multimedia
La IMediaPicker interfaz tiene los métodos siguientes que devuelven un FileResult, que se puede usar para obtener la ubicación del archivo o leerlo.
PickPhotoAsync
abre el explorador de elementos multimedia para seleccionar una foto.CapturePhotoAsync
abre la cámara para tomar una foto.PickVideoAsync
abre el explorador de elementos multimedia para seleccionar un vídeo.CaptureVideoAsync
abre la cámara para grabar un vídeo.
Cada método puede opcionalmente aceptar un parámetro MediaPickerOptions que permite establecer Title en algunos sistemas operativos y se muestra al usuario.
En .NET 10, el selector de medios agrega compatibilidad con selección múltiple y nuevas opciones de procesamiento. Use los métodos siguientes:
PickPhotosAsync (devuelve
List<FileResult>)
Abre el explorador multimedia para seleccionar una o varias fotos.CapturePhotoAsync (devuelve
FileResult?)
abre la cámara para tomar una foto.PickVideosAsync (devuelve
List<FileResult>)
Abre el explorador multimedia para seleccionar uno o varios vídeos.CaptureVideoAsync (devuelve
FileResult?)
abre la cámara para grabar un vídeo.
El MediaPickerOptions parámetro expone campos adicionales, como SelectionLimit, , MaximumWidthMaximumHeight, CompressionQuality, RotateImagey PreserveMetaData.
Importante
Cuando el usuario cancela una operación de selección múltiple, la lista devuelta está vacía. En Android, es posible que algunas interfaces de usuario del selector no apliquen SelectionLimit; en Windows, SelectionLimit no se admite. Implemente su propia lógica para aplicar límites o notificar al usuario en estas plataformas.
Elegir varias fotos
var results = await MediaPicker.PickPhotosAsync(new MediaPickerOptions
{
// Default is 1; set to 0 for no limit
SelectionLimit = 10,
// Optional processing for images
MaximumWidth = 1024,
MaximumHeight = 768,
CompressionQuality = 85,
RotateImage = true,
PreserveMetaData = true,
});
foreach (var file in results)
{
using var stream = await file.OpenReadAsync();
// Process the stream
}
Selección de varios vídeos
var results = await MediaPicker.PickVideosAsync(new MediaPickerOptions
{
SelectionLimit = 3,
Title = "Select up to 3 videos",
});
foreach (var file in results)
{
using var stream = await file.OpenReadAsync();
// Process the stream
}
Sugerencia
Para una selección única, prefiera PickPhotosAsync/PickVideosAsync también. Establezca SelectionLimit = 1 (valor predeterminado) y lea el primer elemento si está presente.
Importante
Los métodos del selector de medios que abren la cámara o la interfaz de usuario del selector deben llamarse en el hilo de la interfaz de usuario, ya que .NET MAUI administra automáticamente las comprobaciones y solicitudes de permisos.
Guardar medios capturados en la galería
La MediaPickerOptions.SaveToGallery propiedad controla si también se guarda una foto o un vídeo capturados en la galería del dispositivo. El valor predeterminado es falsey la propiedad solo se aplica a CapturePhotoAsync las operaciones y CaptureVideoAsync . Las operaciones de selección de medios omiten.
FileResult? photo = await MediaPicker.Default.CapturePhotoAsync(
new MediaPickerOptions
{
SaveToGallery = true
});
El almacenamiento de medios capturados en la galería es compatible con Android, iOS y Mac Catalyst. En iOS y Mac Catalyst, la NSPhotoLibraryAddUsageDescription clave debe estar presente en Info.plist. En versiones de Android anteriores a la API 29, se requiere el WRITE_EXTERNAL_STORAGE permiso. La propiedad se omite en Windows y Tizen.
Recuperar operaciones interrumpidas del selector multimedia de Android
En Android, el sistema puede destruir y volver a crear tu aplicación mientras la interfaz de usuario de la cámara o del selector de fotos está en primer plano. Si la tarea original del selector de medios ha desaparecido cuando se reanuda la aplicación, use las API de recuperación solo para Android para recuperar los resultados aceptados.
La recuperación está disponible para las operaciones del selector de medios basadas en AndroidX: capturar foto, capturar vídeo, seleccionar una foto, seleccionar fotos, seleccionar un vídeo y seleccionar vídeos. Cada RecoveredMediaPickerResult tiene un Id, un Kind y una colección Files que contiene objetos FileResult recuperados. El RecoveredMediaPickerResultKind valor identifica la operación como CapturePhoto, , CaptureVideoPickPhoto, PickPhotos, o PickVideoPickVideos.
Dado que las API de recuperación son de solo Android, coloque el código de recuperación en un archivo específico de Android o guardándolo con #if ANDROID en código compartido.
using System.IO;
using Microsoft.Maui.Media;
using Microsoft.Maui.Storage;
#if ANDROID
async Task RecoverMediaPickerResultsAsync()
{
var results = await MediaPicker.GetRecoveredMediaPickerResultsAsync();
foreach (var result in results)
{
foreach (var file in result.Files)
{
var destination = Path.Combine(FileSystem.CacheDirectory, file.FileName);
using var source = await file.OpenReadAsync();
using var target = File.Create(destination);
await source.CopyToAsync(target);
}
await MediaPicker.ClearRecoveredMediaPickerResultAsync(result.Id);
}
}
#endif
Utilice MediaPicker.GetRecoveredMediaPickerResultsAsync para consultar los resultados ya recuperados y llame a MediaPicker.ClearRecoveredMediaPickerResultAsync después de que su aplicación procese cada resultado. Si su flujo de inicio o reanudación necesita esperar a que se complete la reconciliación de recuperación, llame a MediaPicker.WaitForRecoveredMediaPickerResultsAsync con un CancellationToken. Si, por el contrario, la aplicación debe abandonar una operación pendiente del selector de medios, llame a MediaPicker.DiscardPendingMediaPickerOperationAsync.
Importante
La recuperación de resultados del selector de medios es solo Android y no cambia el comportamiento del selector de medios en iOS, Mac Catalyst o Windows.
Tomar una foto
Llama al método CapturePhotoAsync para abrir la cámara y permitir que el usuario tome una foto. Si el usuario toma una foto, el valor devuelto por el método será un valor distinto de null. En el ejemplo de código siguiente se usa el selector de archivos multimedia para tomar una foto y guardarla en el directorio de la caché:
public async void TakePhoto()
{
if (MediaPicker.Default.IsCaptureSupported)
{
FileResult photo = await MediaPicker.Default.CapturePhotoAsync();
if (photo != null)
{
// save the file into local storage
string localFilePath = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
using Stream sourceStream = await photo.OpenReadAsync();
using FileStream localFileStream = File.OpenWrite(localFilePath);
await sourceStream.CopyToAsync(localFileStream);
}
}
}
Sugerencia
La propiedad FullPath no siempre devuelve la ruta de acceso física al archivo. Para obtener el archivo, use el método OpenReadAsync.