Xamarin.Essentials: Selektor multimediów

Klasa MediaPicker pozwala użytkownikowi wybrać lub zrobić zdjęcie lub wideo na urządzeniu.

Rozpocznij

Aby rozpocząć korzystanie z tego interfejsu API, przeczytaj przewodnik wprowadzający , Xamarin.Essentials aby upewnić się, że biblioteka jest prawidłowo zainstalowana i skonfigurowana w projektach.

Aby uzyskać dostęp do funkcji platformy MediaPicker , wymagana jest następująca konfiguracja specyficzna dla platformy.

Następujące uprawnienia są wymagane i muszą być skonfigurowane w projekcie systemu Android. Można to dodać w następujący sposób:

Otwórz plik AssemblyInfo.cs w folderze Właściwości i dodaj:

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

LUB Zaktualizuj manifest systemu Android:

Otwórz plik AndroidManifest.xml w folderze Właściwości i dodaj następujący element w węźle manifestu.

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

Możesz też kliknąć prawym przyciskiem myszy projekt systemu Android i otworzyć właściwości projektu. W obszarze Manifest systemu Android znajdź wymagane uprawnienia: obszar i sprawdź te uprawnienia. Spowoduje to automatyczne zaktualizowanie pliku AndroidManifest.xml .

Jeśli docelowa wersja systemu Android projektu jest ustawiona na Android 11 (R API 30), musisz zaktualizować manifest systemu Android za pomocą zapytań, które są używane z nowymi wymaganiami dotyczącymi widoczności pakietu.

Otwórz plik AndroidManifest.xml w folderze Właściwości i dodaj następujące elementy w węźle manifestu:

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

Korzystanie z selektora multimediów

Klasa MediaPicker ma następujące metody, które zwracają FileResult element , który może służyć do pobrania lokalizacji plików lub odczytania go jako Stream.

  • PickPhotoAsync: Otwiera przeglądarkę multimediów, aby wybrać zdjęcie.
  • CapturePhotoAsync: Otwiera aparat, aby zrobić zdjęcie.
  • PickVideoAsync: Otwiera przeglądarkę multimediów, aby wybrać film wideo.
  • CaptureVideoAsync: Otwiera kamerę, aby wykonać wideo.

Każda metoda opcjonalnie przyjmuje MediaPickerOptions parametr, który umożliwia Title ustawienie elementu w niektórych systemach operacyjnych wyświetlanych użytkownikom.

Napiwek

Wszystkie metody muszą być wywoływane w wątku interfejsu użytkownika, ponieważ kontrole uprawnień i żądania są automatycznie obsługiwane przez Xamarin.Essentialsprogram .

Ogólne użycie

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

Napiwek

Właściwość FullPath nie zawsze zwraca ścieżkę fizyczną do pliku. Aby pobrać plik, użyj OpenReadAsync metody .

interfejs API