Xamarin.Essentials: Seletor de mídia

A classe MediaPicker permite que um usuário escolha ou tire uma foto ou vídeo no dispositivo.

Introdução

Para começar a usar essa API, leia o guia de introdução para Xamarin.Essentials garantir que a biblioteca esteja instalada e configurada corretamente em seus projetos.

Para acessar a funcionalidade MediaPicker, é necessária a seguinte configuração específica da plataforma.

As permissões a seguir são necessárias e devem ser configuradas no projeto Android. Isso pode ser usado das seguintes maneiras:

Abra o arquivo AssemblyInfo.cs na pasta Propriedades e adicione:

// 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 Atualize o Manifesto do Android:

Abra o arquivo AndroidManifest.xml na pasta Propriedades e adicione o seguinte dentro do nó do manifesto.

<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 clique com o botão direito do mouse no projeto do Android e abra as propriedades do projeto. Em Manifesto do Android, localize a área Permissões necessárias: e verifique essas permissões. Isso atualizará automaticamente o arquivo AndroidManifest.xml.

Se a versão do Android de destino do projeto estiver definida como Android 11 (API R 30), você deverá atualizar o manifesto do Android com consultas usadas com os novos requisitos de visibilidade do pacote.

Abra o arquivo AndroidManifest.xml na pasta Propriedades e adicione o seguinte dentro do nó do manifesto:

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

Usando o Seletor de Mídia

A MediaPicker classe tem os seguintes métodos que retornam um FileResult que pode ser usado para obter o local dos arquivos ou lê-lo como um Streamarquivo .

  • PickPhotoAsync: Abre o navegador de mídia para selecionar uma foto.
  • CapturePhotoAsync: Abre a câmera para tirar uma foto.
  • PickVideoAsync: Abre o navegador de mídia para selecionar um vídeo.
  • CaptureVideoAsync: Abre a câmera para gravar um vídeo.

Cada método opcionalmente recebe um MediaPickerOptions parâmetro que permite que ele Title seja definido em alguns sistemas operacionais que é exibido aos usuários.

Dica

Todos os métodos devem ser chamados no thread da interface do usuário porque as verificações de permissão e as solicitações são tratadas automaticamente pelo Xamarin.Essentials.

Uso geral

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

Dica

A FullPath propriedade nem sempre retorna o caminho físico para o arquivo. Use o método OpenReadAsync para acessar o arquivo.

API