Utilizando a Câmera – Xamarin.Forms

Olá, neste post irei demonstrar como a sua aplicação Xamarin.Forms pode acessar a câmera do dispositivo para tirar uma foto, fazer um vídeo ou acessar a galeria.

Para este exemplo irei assumir que você acabou de criar uma aplicação Xamarin.Forms, caso possua alguma dúvida sobre isso recomendo ler o post Criando um projeto Xamarin.Forms.

O primeiro passo após a sua aplicação ter sido criada é adicionar o Nuget Package Xam.Plugin.Media.

ADICIONANDO O NUGET PACKAGE

Clique com o botão direito em cima de sua Solution e selecione “Manage NuGet Packages for Solution…”.

nugetp

 

Digite “Xam.Plugin.Media” e selecione o plugin como demonstrado na imagem a seguir.

nuget

 

Selecione todos os projetos e clique no botão “Install”.

nuget

Android

Para a plataforma Android é necessário realizar a inicialização do plugin no arquivo MainActivity, para isso adicione a seguinte linha de código após o comando base.OnCreate(bundle):

await CrossMedia.Current.Initialize();

Também sobrescreva o método OnRequestPermissionsResult como demonstrado a seguir.

 

Em seguida, é preciso adicionar a permissão para o seu app acessar a câmera, isso é feito no  arquivo AndroidManifest.xml.

  • Adicione a permissão “android.permission.CAMERA”.
  • Dentro de application, adicione o provider e meta-data como demonstrado a seguir.

 

 

Dentro da pasta “Resources” crie uma pasta chamada xml e  adicione um arquivo chamado file_paths.xml, como demonstrado a seguir.

iOS

Adicionar permissões para que o seu app acesse a câmera na plataforma iOS é necessário editar o arquivo Info.plist que encontra-se no seu projeto .iOS

info

No arquivo Info.plist iremos adicionar as seguintes chaves:

  • NSCameraUsageDescription
  • NSPhotoLibraryUsageDescription
  • NSMicrophoneUsageDescription
  • NSPhotoLibraryAddUsageDescription

Portable

O próximo passo é colocar alguns botões para acionar a câmera ou a galeria e um Image para demonstrar a foto tirada.

Xaml

O evento click de cada botão ira chamar o seu respectivo método, como demonstrado a seguir.

Tirar Foto

tirarfoto

 

Escolher Foto

escolherfoto

 

Gravar Vídeo

gravarvideo.png

 

Escolher Vídeo

escolhervideo

CODE-BEHIND

Resultado

ezgif.com-gif-maker

 

Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.

icongithub

44 comentários em “Utilizando a Câmera – Xamarin.Forms

  1. sabe me dizer como tirar uma FOTO DO VIDEO ? tipo screenshot, mas com a camera em modo video, ai uma função para ir batendo foto dos frame da camera ?

    Curtir

  2. Juliano, ao usar o evento Tirar Foto , visualizo a foto tirada e ao dar ok o meu aplicativo é jogado para o segundo plano. O que pode ser?

    Curtir

      1. No momento fiz apenas teste no meu celular mesmo. Tanto tirar uma foto nova como escolher na galeria, ao confirmar o APP fecha.

        Curtir

      2. Juliano ainda não tive sucesso. Caso não seja inconveniente segue abaixo o meu OutPut
        04-01 23:52:46.491 D/SecWifiDisplayUtil( 2994): Metadata value : SecSettings2
        04-01 23:52:46.491 D/ViewRootImpl( 2994): #1 mView = com.android.internal.policy.PhoneWindow$DecorView{c3923e2 I.E…… R…..ID 0,0-0,0}
        04-01 23:52:46.811 D/mali_winsys( 2994): new_window_surface returns 0x3000, [720×1280]-format:1
        04-01 23:52:46.831 D/ViewRootImpl( 2994): MSG_RESIZED_REPORT: ci=Rect(0, 48 – 0, 0) vi=Rect(0, 48 – 0, 0) or=1
        04-01 23:52:47.051 D/ViewRootImpl( 2994): #3 mView = null
        04-01 23:52:47.721 I/art ( 2994): Starting a blocking GC Explicit
        04-01 23:52:47.761 I/art ( 2994): Explicit concurrent mark sweep GC freed 1273(58KB) AllocSpace objects, 0(0B) LOS objects, 16% free, 41MB/49MB, paused 608us total 35.386ms
        04-01 23:52:47.761 D/Mono ( 2994): GC_TAR_BRIDGE bridges 299 objects 8103 colors 299 ignored 3478 sccs 299 xref 0 cache 0/0 setup 0.09ms tarjan 6.18ms scc-setup 0.13ms gather-xref 0.01ms xref-setup 0.00ms cleanup 0.66ms
        04-01 23:52:47.761 D/Mono ( 2994): GC_BRIDGE: Complete, was running for 39.49ms
        04-01 23:52:47.761 D/Mono ( 2994): GC_MINOR: (Nursery full) time 16.99ms, stw 17.39ms promoted 190K major size: 3728K in use: 2664K los size: 1024K in use: 788K

        Curtir

  3. Olá Juliano, fiz os mesmo passo em uma app net standard, mas esta dando erro “Java.Lang.RuntimeException: Unable to start activity ComponentInfo{com.companyname.App2/md5e528b4472ea765fab6a0696a5fd66c3a.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.support.v7.widget.ContentFrameLayout.setAttachListener(android.support.v7.widget.ContentFrameLayout$OnAttachListener)’ on a null object reference” e para o app.
    A câmera funciona somente se altera a herança do MainActivity para Xamarin.Forms.Platform.Android.FormsApplicationActivity, mas com essa alteração não consigo usar uma MasterPage.
    O pode ser?

    Curtido por 1 pessoa

  4. na hora de abrir a câmera travou na seguinte linha
    var file = await CrossMedia.Current.TakePhotoAsync(
    new StoreCameraMediaOptions
    {
    SaveToAlbum = true,
    Directory = “Demo”
    });
    agradeço ajuda desde já

    Curtir

      1. e o melhor é, quando é pra pegar da galeria funciona! de cabelo em pé aqui já pois preciso disso pro trabalho

        Curtir

  5. Juliano, boa tarde!

    No projeto para iOS, nao consegui localizar no arquivo Info.plist onde eu coloco as chaves

    NSCameraUsageDescription
    NSPhotoLibraryUsageDescription
    NSMicrophoneUsageDescription
    NSPhotoLibraryAddUsageDescription

    Poderia me ajudar?

    Curtir

    1. Olá Vilmar,

      Botão direito no Arquivo Info.plist, abrir com, XML Text Editor.
      Em seguida coloque dentro de “dict” depois do nome do seu app.

      Espero ter ajudado. 🙂

      Curtir

  6. Juliano, boa noite! To com o seguinte erro:

    Unhandled Exception:

    Java.Lang.RuntimeException: Unable to start activity ComponentInfo{Procon_Sorocaba.Procon_Sorocaba/md53d87c17fb05de643ade6b138d9319cf2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.support.v7.widget.ContentFrameLayout.setAttachListener(android.support.v7.widget.ContentFrameLayout$OnAttachListener)’ on a null object reference

    Consegue me ajudar? Falta so isso pra terminar o projeto …

    Curtir

    1. Desconsidera, deu certo aqui. Peguei o problema de cima que tava ai e era exatamente o mesmo. Unico problema que ele nao ta pegando a permissão automática pra acessar camera e galeria. Tem algum jeito?

      Curtir

      1. Olá Vilmar,

        isso está acontecendo no iOS ?
        Você está rodando em debug ?
        Lembre-se que cada vez que você executa o projeto pelo VS ele desinstala o app e instala novamente, então será pedido a permissão novamente.
        Experimente fechar o app e abrir novamente sem rodar pelo VS, acredito que ele não irá pedir mais a permissão a partir do segundo acesso.

        Espero ter ajudado.

        Curtir

      2. Consegui finalmente instalar, mas assim que termino a instalção o método
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
        global::Xamarin.Forms.Forms.Init();
        LoadApplication(new App());

        return base.FinishedLaunching(app, options);
        }
        para de funcionar 😦
        a linha LoadApplication(new App()); no App() fica vermelho sem achar o namespace e não consegui resolver

        Curtir

  7. Boa dia Juliana, estou tendo um erro ao inicializar o plugin, Erro(System.NotImplementedException: This functionality is not implemented in the portable version of this assembly. You should reference the NuGet package from your main application project in order to reference the platform-specific implementation.).
    Não posso utilizar esse plugin no projeto UWP ?

    Curtir

    1. Olá Amanda,

      De acordo com a Documentação desse plugin, ele suporta UWP sim.

      Verifique se o plugin está instalado em todos os projetos da sua Solution.

      Espero ter ajudado 🙂

      Curtir

  8. Boa tarde, consegui fazer funcionar tudo certinho. Gostaria de saber se eu consigo tirar fotos automaticamente por esse plugin, como se o botão do MAIN já batesse a foto após chamar a câmera.

    Curtir

    1. Boa tarde,

      Acredito que não seja possível utilizando esse plugin. Já que a ideia do Media.Plugin é ativar a câmera e depois pegar a foto tirada pelo usuário.

      Curtir

      1. Olá Alberto,

        Na própria postagem, verifique os passos destinados a cada plataforma. 🙂

        Curtir

      2. Estou com o mesmo erro e não consegui resolver. Já olhei o código várias vezes, nenhuma diferença, limpei a solução, compilei novamente e nada. Consegue me ajudar?

        Curtir

      3. Olá Otávio,

        Você alterou o arquivo do AndroidManifest ? Verifique se trocou o nome do pacote corretamente caso tenha copiado o código do post.

        Curtir

      4. Até refiz o projeto, depois de tudo verificado deu certo. Provavelmente tenha tido algum problema no AndroidManifest mesmo, mas o que fez meu app funcionar mesmo depois de tudo conferido foi dar um clean e um build novamente.

        Curtir

  9. Juliano, boa noite,
    Estou usando o Visual Studio Community 2017; instalei o Nuget Xam.Plugin.Midea e quando faço a compilação aparece a mensagem de Erro: “Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly ‘Plugin.Permissions.Abstractions, Version=2.2.1.0, Culture=neutral, PublicKeyToken=’. Perhaps it doesn’t exist in the Mono for Android profile?
    Nome do arquivo: ‘Plugin.Permissions.Abstractions.dll’
    em Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters)
    em Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(DirectoryAssemblyResolver resolver, ICollection`1 assemblies, AssemblyDefinition assembly, Boolean topLevel)
    em Xamarin.Android.Tasks.ResolveAssemblies.Execute(DirectoryAssemblyResolver resolver) Moshi.Android
    Você pode me ajudar?

    Curtir

    1. Olá Edgar,

      Você alterou o arquivo do AndroidManifest ? Verifique se trocou o nome do pacote corretamente caso tenha copiado o código do post.

      Curtir

  10. Estava dando erro ao clicar em “TIRAR FOTO”

    System.ArgumentException: Unable to get file location. This most likely means that the file provider information is not set in your Android Manifest file. Please check documentation on how to set this up in your project.

    Funcionou somente depois que eu modifiquei

    De: android:authorities=”com.companyname.DemoCamera.fileprovider”

    Para: android:authorities=”com.companyname.Camera1.fileprovider”

    Como sou novato, copiei o trecho do seu código. Depois de alguma procura fiz a alteração do valor da atributo e rolou.

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s