Medienauswahlwerkzeug für Fotos und Videos

Beispiel durchsuchen. Beispiel durchsuchen

In diesem Artikel wird beschrieben, wie Sie die .NET Multi-Plattform App UI (.NET MAUI) IMediaPicker-Schnittstelle verwenden können. Über diese Schnittstelle kann ein Benutzer ein Foto oder Video auf dem Gerät auswählen oder aufnehmen.

Die Standardimplementierung der IMediaPicker-Schnittstelle ist über die Eigenschaft MediaPicker.Default verfügbar. Sowohl die IMediaPicker-Schnittstelle als auch die MediaPicker-Klasse sind im Microsoft.Maui.Media-Namespace enthalten.

Erste Schritte

Um auf die Medienauswahl zugreifen zu können, ist die folgende plattformspezifische Einrichtung erforderlich.

  • Android
  • iOS/Mac Catalyst
  • Windows

Die CAMERA Berechtigung ist erforderlich und muss im Android-Projekt konfiguriert werden. Außerdem:

  • Wenn Ihre App auf Android 12 oder niedriger ausgerichtet ist, müssen Sie die READ_EXTERNAL_STORAGE und WRITE_EXTERNAL_STORAGE Berechtigungen anfordern.

  • Wenn Ihre App auf Android 13 oder höher ausgerichtet ist und Zugriff auf Mediendateien benötigt, die andere Apps erstellt haben, müssen Sie eine oder mehrere der folgenden präzisen Medienberechtigungen anstelle der Berechtigung READ_EXTERNAL_STORAGE anfordern:

    • READ_MEDIA_IMAGES
    • READ_MEDIA_VIDEO
    • READ_MEDIA_AUDIO

Diese Berechtigungen können auf folgende Weise hinzugefügt werden:

  • Fügen Sie die assemblybasierten Berechtigungen hinzu:

    Öffnen Sie die Datei Platforms/Android/MainApplication.cs und fügen Sie die folgenden Assembly-Attribute nach den using-Anweisungen hinzu:

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

    – oder –

  • Aktualisieren des Android-Manifests

    Öffnen Sie die Datei Platforms/Android/AndroidManifest.xml und fügen Sie Folgendes im manifest-Knoten hinzu:

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

    – oder –

  • Aktualisieren Sie das Android-Manifest im Manifest-Editor:

    Doppelklicken Sie in Visual Studio auf die Datei Platforms/Android/AndroidManifest.xml, um den Android-Manifest-Editor zu öffnen. Überprüfen Sie dann unter Erforderliche Berechtigungen die oben aufgeführten Berechtigungen. Dadurch wird die Datei AndroidManifest.xml automatisch aktualisiert.

Wenn die Zielversion Ihres Projekts auf Android 11 (R API 30) oder höher festgelegt ist, müssen Sie Ihr Android-Manifest mit Abfragen aktualisieren, die die Paket-Sichtbarkeitsanforderungen von Android erfüllen.

Fügen Sie in der Datei Platforms/Android/AndroidManifest.xml die folgenden queries/intent-Knoten im manifest-Knoten hinzu:

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

Verwenden von Medienauswahl

Die IMediaPicker Schnittstelle verfügt über die folgenden Methoden, die einen FileResultzurückgeben, der verwendet werden kann, um den Speicherort der Datei abzurufen oder zu lesen.

Jede Methode verwendet optional einen MediaPickerOptions Parameter, der die Title Festlegung auf einigen Betriebssystemen ermöglicht, die dem Benutzer angezeigt wird.

In .NET 10 werden der Medienauswahlfunktion die Unterstützung für Mehrfachauswahl sowie neue Verarbeitungsoptionen hinzugefügt. Verwenden Sie die folgenden Methoden:

  • PickPhotosAsync (gibt List<FileResult>zurück)
    Öffnet den Medienbrowser, um ein oder mehrere Fotos auszuwählen.

  • CapturePhotoAsync (gibt FileResult?zurück)
    Öffnet die Kamera, um ein Foto aufzunehmen.

  • PickVideosAsync (gibt List<FileResult>zurück)
    Öffnet den Medienbrowser, um ein oder mehrere Videos auszuwählen.

  • CaptureVideoAsync (gibt FileResult?zurück)
    Öffnet die Kamera, um ein Video aufzunehmen.

Der MediaPickerOptions-Parameter macht zusätzliche Felder verfügbar, wie SelectionLimit, MaximumWidth, MaximumHeight, CompressionQuality, RotateImage und PreserveMetaData.

Wichtig

Wenn der Benutzer einen Mehrfachauswahlvorgang abbricht, ist die zurückgegebene Liste leer. Unter Android erzwingen möglicherweise einige Auswahlbenutzeroberflächen SelectionLimit nicht, während SelectionLimit unter Windows nicht unterstützt wird. Implementieren Sie Ihre eigene Logik, um Grenzwerte zu erzwingen oder den Benutzer auf diesen Plattformen zu benachrichtigen.

Auswählen mehrerer 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
}

Auswählen mehrerer Videos

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
}

Tipp

Für eine Einzelwahl bevorzugen Sie ebenfalls PickPhotosAsync/PickVideosAsync. Legen Sie SelectionLimit = 1 (standard) fest, und lesen Sie das erste Element, falls vorhanden.

Wichtig

Methoden der Medienauswahl, die die Kamera oder die Auswahloberfläche öffnen, müssen auf dem UI-Thread aufgerufen werden, da Berechtigungsprüfungen und -anfragen automatisch von .NET MAUI verarbeitet werden.

Die MediaPickerOptions.SaveToGallery Eigenschaft steuert, ob ein aufgenommenes Foto oder Video auch im Katalog des Geräts gespeichert wird. Der Standardwert ist false, und die Eigenschaft gilt nur für CapturePhotoAsync und CaptureVideoAsync Vorgänge. Sie wird von Medienauswahlvorgängen ignoriert.

FileResult? photo = await MediaPicker.Default.CapturePhotoAsync(
    new MediaPickerOptions
    {
        SaveToGallery = true
    });

Das Speichern aufgenommener Medien im Katalog wird unter Android, iOS und Mac Catalyst unterstützt. Unter iOS und Mac Catalyst muss der NSPhotoLibraryAddUsageDescription Schlüssel in Info.plist vorhanden sein. In Android-Versionen vor API 29 ist die WRITE_EXTERNAL_STORAGE Berechtigung erforderlich. Die Eigenschaft wird für Windows und Tizen ignoriert.

Wiederherstellen unterbrochener Android-Medienauswahlvorgänge

Unter Android kann das System Ihre App zerstören und neu erstellen, während sich die Kamera- oder Fotoauswahl-UI im Vordergrund befindet. Wenn die ursprüngliche Medienauswahlaufgabe nicht mehr vorhanden ist, wenn Ihre App wieder aktiv wird, verwenden Sie die nur unter Android verfügbaren Wiederherstellungs-APIs, um bereits bestätigte Ergebnisse abzurufen.

Die Wiederherstellung ist für AndroidX-unterstützte Medienauswahlvorgänge verfügbar: Aufnehmen von Fotos, Aufnehmen von Videos, Auswählen eines Fotos, Auswählen von Fotos, Auswählen eines Videos und Auswählen von Videos. Jeder RecoveredMediaPickerResult verfügt über eine Id, eine Kindund eine Files Auflistung, die wiederhergestellte FileResult Objekte enthält. Der RecoveredMediaPickerResultKind Wert identifiziert den Vorgang als CapturePhoto, , CaptureVideo, PickPhoto, PickPhotos, oder PickVideoPickVideos.

Da die Wiederherstellungs-APIs nur für Android verfügbar sind, platzieren Sie den Wiederherstellungscode in einer Android-spezifischen Datei oder schützen Sie ihn im gemeinsam genutzten Code mit #if ANDROID.

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

Verwenden Sie MediaPicker.GetRecoveredMediaPickerResultsAsync, um bereits wiederhergestellte Ergebnisse abzufragen, und rufen Sie MediaPicker.ClearRecoveredMediaPickerResultAsync auf, nachdem Ihre App jedes Ergebnis verarbeitet hat. Wenn Ihr Start- oder Wiederaufnahmeablauf auf den Wiederherstellungsabgleich warten muss, rufen Sie MediaPicker.WaitForRecoveredMediaPickerResultsAsync mit einer CancellationToken auf. Wenn die App stattdessen einen ausstehenden Medienauswahlvorgang abbrechen soll, rufen Sie auf MediaPicker.DiscardPendingMediaPickerOperationAsync.

Wichtig

Die Wiederherstellung von Medienauswahl-Ergebnissen ist nur für Android verfügbar und ändert das Verhalten der Medienauswahl unter iOS, Mac Catalyst oder Windows nicht.

Ein Foto aufnehmen

Rufen Sie die CapturePhotoAsync Methode auf, um die Kamera zu öffnen und den Benutzer ein Foto aufnehmen zu lassen. Wenn der Benutzer ein Foto macht, ist der Rückgabewert der Methode ein Wert, der nicht null ist. Das folgende Codebeispiel verwendet die Medienauswahl, um ein Foto aufzunehmen und es im Cache-Verzeichnis zu speichern:

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

Tipp

Die Eigenschaft FullPath gibt nicht immer den physischen Pfad zur Datei zurück. Um die Datei abzurufen, verwenden Sie die OpenReadAsync-Methode.