Xamarin.Essentials: Sélecteur de médias

La classe MediaPicker permet à un utilisateur de choisir ou de prendre une photo ou une vidéo sur l’appareil.

Bien démarrer

Pour commencer à utiliser cette API, lisez le guide de prise en main pour Xamarin.Essentials vous assurer que la bibliothèque est correctement installée et configurée dans vos projets.

Pour accéder à la fonctionnalité MediaPicker , la configuration spécifique à la plateforme suivante est requise.

Les autorisations suivantes sont requises et doivent être configurées dans le projet Android. Vous pouvez le faire de plusieurs façons, comme indiqué ci-dessous :

Ouvrez le fichier AssemblyInfo.cs sous le dossier Propriétés et ajoutez :

// 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)]

OU mettez à jour le manifeste Android :

Ouvrez le fichier AndroidManifest.xml sous le dossier Propriétés et ajoutez ce qui suit dans le nœud du manifeste.

<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" />

Ou cliquez avec le bouton droit sur le projet Android et ouvrez les propriétés du projet. Sous Manifeste Android, recherchez les autorisations requises : zone et case activée ces autorisations. Cela met automatiquement à jour le fichier AndroidManifest.xml.

Si la version Android cible de votre projet est définie sur Android 11 (API R 30), vous devez mettre à jour votre manifeste Android avec des requêtes utilisées avec les nouvelles exigences de visibilité du package.

Ouvrez le fichier AndroidManifest.xml sous le dossier Propriétés, puis ajoutez ce qui suit dans le nœud manifeste :

<queries>
  <intent>
    <action android:name="android.media.action.IMAGE_CAPTURE" />
  </intent>
</queries>

Utilisation du sélecteur de supports

La MediaPicker classe a les méthodes suivantes qui retournent tous un FileResult qui peut être utilisé pour obtenir l’emplacement des fichiers ou le lire en tant que Stream.

  • PickPhotoAsync: ouvre le navigateur multimédia pour sélectionner une photo.
  • CapturePhotoAsync: ouvre l’appareil photo pour prendre une photo.
  • PickVideoAsync: ouvre le navigateur multimédia pour sélectionner une vidéo.
  • CaptureVideoAsync: ouvre la caméra pour prendre une vidéo.

Chaque méthode prend éventuellement un MediaPickerOptions paramètre qui permet d’être Title défini sur certains systèmes d’exploitation affichés aux utilisateurs.

Conseil

Toutes les méthodes doivent être appelées sur le thread d’interface utilisateur, car l’autorisation case activée s et les requêtes sont gérées automatiquement par Xamarin.Essentials.

Utilisation générale

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;
}

Conseil

La FullPath propriété ne retourne pas toujours le chemin d’accès physique au fichier. Pour obtenir le fichier, utilisez la OpenReadAsync méthode.

API