Xamarin.Essentials: Selector de archivos multimedia
La clase MediaPicker permite al usuario escoger o tomar una foto o vídeo en el dispositivo.
Introducción
Para empezar a usar esta API, lea la guía de introducción para Xamarin.Essentials con el fin de asegurarse de que la biblioteca está correctamente instalada y configurada en los proyectos.
Para acceder a la función de MediaPicker, se requiere la siguiente configuración específica para la plataforma.
Los permisos siguientes son requeridos y se deben configurar en el proyecto de Android. Se puede agregar de las siguientes maneras:
Abra el archivo AssemblyInfo.cs de la carpeta Propiedades y agregue lo siguiente:
// Needed for Picking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]
// Needed for Taking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesPermission(Android.Manifest.Permission.Camera)]
// 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, actualice el manifiesto de Android:
Abra el archivo AndroidManifest.xml de la carpeta Propiedades y agregue lo siguiente dentro del nodo manifest.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
O haga clic con el botón derecho en el proyecto de Android y abra las propiedades del proyecto. En Manifiesto de Android, busque el área Permisos requeridos: y active estos permisos. 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) , debe actualizar el manifiesto de Android con las consultas que se usan con los nuevos requisitos de visibilidad de los paquetes.
Abra el archivo AndroidManifest.xml de la carpeta Propiedades y agregue lo siguiente dentro del nodo manifest:
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
Uso del Selector de archivos multimedia
La clase MediaPicker
tiene los métodos siguientes que devuelven un elemento FileResult
que se puede usar para obtener la ubicación de los archivos o para leerlo como Stream
.
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 parámetro MediaPickerOptions
que permite establecer el elemento Title
en algunos sistemas operativos que se muestran a los usuarios.
Sugerencia
Se debe llamar a todos los métodos del subproceso de interfaz de usuario porque Xamarin.Essentialscontrola automáticamente las solicitudes y comprobaciones de permisos.
Uso general
async Task TakePhotoAsync()
{
try
{
var photo = await MediaPicker.CapturePhotoAsync();
await LoadPhotoAsync(photo);
Console.WriteLine($"CapturePhotoAsync COMPLETED: {PhotoPath}");
}
catch (FeatureNotSupportedException fnsEx)
{
// Feature is not supported on the device
}
catch (PermissionException pEx)
{
// Permissions not granted
}
catch (Exception ex)
{
Console.WriteLine($"CapturePhotoAsync THREW: {ex.Message}");
}
}
async Task LoadPhotoAsync(FileResult photo)
{
// canceled
if (photo == null)
{
PhotoPath = null;
return;
}
// save the file into local storage
var newFile = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
using (var stream = await photo.OpenReadAsync())
using (var newStream = File.OpenWrite(newFile))
await stream.CopyToAsync(newStream);
PhotoPath = newFile;
}
Sugerencia
La propiedad FullPath
no siempre devuelve la ruta de acceso física al archivo. Para obtener el archivo, use el método OpenReadAsync
.