Selector de archivos multimedia para fotos y vídeos
En este artículo se describe cómo puedes usar la interfaz IMediaPicker de .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
.
Introducción
Para acceder a la función del selector de archivos multimedia, se requiere la siguiente configuración específica para la plataforma:
El permiso CAMERA
es necesario y se debe configurar en el proyecto Android. Además:
Si la aplicación tiene como destino Android 12 o inferior, debes solicitar los permisos
READ_EXTERNAL_STORAGE
yWRITE_EXTERNAL_STORAGE
.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_IMAGES
READ_MEDIA_VIDEO
READ_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 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.CAMERA" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_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.
Si la versión de Android de destino del proyecto se establece en Android 11 (R API 30) o superior, debes actualizar el manifiesto de Android con las consultas que se usan con los requisitos de visibilidad de los paquetes de Android.
En el archivo Platforms/Android/AndroidManifest.xml, agrega los nodos queries/intent
siguientes en el nodo manifest
:
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
Uso del selector de archivos multimedia
La interfaz IMediaPicker tiene los métodos siguientes que devuelven un FileResult, que se puede usar para obtener la ubicación del archivo o para 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 toma opcionalmente un tipo de parámetro MediaPickerOptions que permite establecer el elemento Title en algunos sistemas operativos, que se muestran a los usuarios.
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.
Tomar una foto
Llama al método CapturePhotoAsync para abrir la cámara y dejar 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.