Partilhar via


Seletor de mídia para fotos e vídeos

Browse sample. Navegue pelo exemplo

Este artigo descreve como você pode usar a interface .NET Multi-platform App UI (.NET MAUI). IMediaPicker Essa interface permite que um usuário escolha ou tire uma foto ou vídeo no dispositivo.

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

Introdução

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

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

  • Se o seu aplicativo tiver como alvo o Android 12 ou inferior, você deverá solicitar as READ_EXTERNAL_STORAGE permissões e WRITE_EXTERNAL_STORAGE .

  • Se seu aplicativo tiver como alvo o Android 13 ou superior e precisar de acesso a arquivos de mídia criados por outros aplicativos, você deverá solicitar uma ou mais das seguintes permissões de mídia granular em vez da READ_EXTERNAL_STORAGE permissão:

    • 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 using as diretivas:

    // 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 manifest seguinte no nó:

    <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 do Android de destino do seu projeto estiver definida como Android 11 (R API 30) ou superior, você deverá atualizar o manifesto do Android com consultas que usam os requisitos de visibilidade do pacote do Android.

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

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

Usando o seletor de mídia

A IMediaPicker interface 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 usa um tipo de MediaPickerOptions parâmetro que permite que o Title seja definido em alguns sistemas operacionais, que é exibido ao usuário.

Importante

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 .NET MAUI.

Tirar uma foto

Chame o método para abrir a câmera e permita que o CapturePhotoAsync usuário tire uma foto. Se o usuário tirar uma foto, o valor de retorno 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 FullPath propriedade nem sempre retorna o caminho físico para o arquivo. Para obter o arquivo, use o OpenReadAsync método.