Xamarin.Essentials: Medienauswahl

Mit der MediaPicker-Klasse können Benutzer ein Foto oder Video auf dem Gerät auswählen oder aufnehmen.

Erste Schritte

Lesen Sie zum Einstieg in die Verwendung dieser API den Leitfaden mit ersten Schritte für Xamarin.Essentials, um sicherzustellen, dass die Bibliothek ordnungsgemäß installiert und in Ihren Projekten eingerichtet ist.

Für den Zugriff auf die MediaPicker-Funktionen ist die folgende plattformspezifische Einrichtung erforderlich.

Die folgenden Berechtigungen sind erforderlich und müssen im Android-Projekt konfiguriert werden. Das Hinzufügen erfolgt folgendermaßen:

Öffnen Sie die Datei AssemblyInfo.cs im Ordner Eigenschaften und fügen Sie Folgendes hinzu:

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

Alternativ können Sie das Android-Manifest aktualisieren:

Öffnen Sie die Datei AndroidManifest.xml im Ordner Eigenschaften, und fügen Sie Folgendes im Knoten Manifest hinzu.

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

Alternativ können Sie mit der rechten Maustaste auf das Android-Projekt klicken und die Eigenschaften des Projekts öffnen. Suchen Sie unter Android-Manifest den Bereich Erforderliche Berechtigungen:, und aktivieren Sie diese Berechtigungen. Dadurch wird die Datei AndroidManifest.xml automatisch aktualisiert.

Wenn die Android-Zielversion des Projekts auf Android 11 (R API 30) festgelegt ist, müssen Sie Ihr Android-Manifest mit Abfragen aktualisieren, die mit den neuen Paketsichtbarkeitsanforderungen verwendet werden.

Öffnen Sie die Datei AndroidManifest.xml im Ordner Eigenschaften, und fügen Sie Folgendes im Knoten Manifest hinzu:

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

Verwenden von MediaPicker

Die MediaPicker-Klasse enthält die folgenden Methoden, die alle ein FileResult zurückgeben, mit dem der Speicherort der Dateien abgerufen werden kann oder diese als Stream gelesen werden können.

  • PickPhotoAsync: Öffnet den Medienbrowser, um ein Foto auszuwählen.
  • CapturePhotoAsync: Öffnet die Kamera, um ein Foto aufzunehmen.
  • PickVideoAsync: Öffnet den Medienbrowser, um ein Video auszuwählen.
  • CaptureVideoAsync: Öffnet die Kamera, um ein Video aufzunehmen.

Jede Methode übernimmt optional einen MediaPickerOptions-Parameter, mit dem der Title, der Benutzern angezeigt wird, unter einigen Betriebssystemen festgelegt werden kann.

Tipp

Alle Methoden müssen im UI-Thread aufgerufen werden, da Überprüfungen und Anforderungen für Berechtigungen automatisch von Xamarin.Essentials behandelt werden.

Allgemeine Verwendung

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

Tipp

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

API