Compartilhar via


Seletor de mídia para fotos e vídeos

Procurar amostra. Procurar no exemplo

Este artigo descreve como você pode usar a interface do usuário do aplicativo .NET multiplataforma (.NET MAUI) IMediaPicker. Essa interface permite que um usuário escolha ou tire uma foto ou faça vídeo no dispositivo.

A implementação padrão da interface IMediaPicker está disponível por meio da propriedade MediaPicker.Default. A interface IMediaPicker e a classe MediaPicker estão contidas no namespace Microsoft.Maui.Media.

Introdução

Para acessar a funcionalidade seletor de mídia, a configuração específica da plataforma a seguir é necessária.

A permissão CAMERA é necessária e deve ser configurada no projeto do Android. Além disso:

  • Se o app for direcionado ao Android 12 ou versões anteriores, solicite as permissões READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE.

  • Se o app for destinado ao Android 13 ou versões mais recentes e precisar de acesso a arquivos de mídia criados por outros apps, solicite uma ou mais das seguintes permissões de mídia granular em vez da permissão READ_EXTERNAL_STORAGE:

    • READ_MEDIA_IMAGES
    • READ_MEDIA_VIDEO
    • READ_MEDIA_AUDIO

Essas permissões podem ser adicionadas das seguintes maneiras:

  • Adicione as permissões baseadas em assembly:

    Abra o arquivo Platforms/Android/MainApplication.cs e adicione os seguintes atributos de assembly após as diretivas using:

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

    - ou -

  • Atualize o manifesto do Android:

    Abra o arquivo Platforms/Android/AndroidManifest.xml e adicione o seguinte no nó manifest:

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />    
    <!-- Required only if your app needs to access images or photos that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <!-- Required only if your app needs to access videos that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <!-- Required only if your app needs to access audio files that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />    
    

    - ou -

  • Atualize o Manifesto do Android no editor de manifesto:

    No Visual Studio, clique duas vezes no arquivo Platforms/Android/AndroidManifest.xml para abrir o editor de manifesto do Android. Em seguida, em Permissões necessárias, verifique as permissões listadas acima. Isso atualizará automaticamente o arquivo AndroidManifest.xml.

Se a versão Target Android do seu projeto estiver definida como Android 11 (R API 30) ou superior, você deverá atualizar seu Android Manifest com consultas que usam os requisitos de visibilidade do pacote do Android.

No arquivo Platforms/Android/AndroidManifest.xml, adicione os seguintes nós queries/intent no nó manifest:

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

Uso do seletor de mídia

A interface IMediaPicker tem os seguintes métodos que retornam um FileResult, que pode ser usado para obter a localização do arquivo ou lê-lo.

Cada método opcionalmente recebe um tipo de parâmetro MediaPickerOptions que permite que o Title seja definido em alguns sistemas operacionais, que é exibido para o usuário.

Importante

Todos os métodos devem ser chamados no thread da IU porque as verificações de permissão e as solicitações são tratadas automaticamente pelo .NET MAUI.

Tirar uma foto

Chame o método CapturePhotoAsync para abrir a câmera e permitir que o usuário tire uma foto. Se o usuário tirar uma foto, o valor retornado do método será um valor não nulo. O exemplo de código a seguir usa o seletor de mídia para tirar uma foto e salvá-la no diretório de cache:

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

Dica

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