Quero escrever um módulo em que, com o clique de um botão, a câmera se abre e posso clicar e capturar uma imagem. Se eu não gostar da imagem, posso excluí-la e clicar em mais uma imagem. Em seguida, selecione a imagem e ela deverá retornar e exibir essa imagem na atividade.
278
Respostas:
Aqui está um exemplo de atividade que inicia o aplicativo da câmera, recupera a imagem e a exibe.
Observe que o próprio aplicativo da câmera oferece a capacidade de revisar / retomar a imagem e, uma vez que uma imagem é aceita, a atividade a exibe.
Aqui está o layout que a atividade acima usa. É simplesmente um LinearLayout contendo um botão com o id button1 e um ImageView com o id imageview1:
E um detalhe final, certifique-se de adicionar:
e se a câmera for opcional para a funcionalidade do seu aplicativo. certifique-se de definir exigir como falso na permissão. como isso
para o seu manifest.xml.
fonte
<uses-feature/>
oandroid:required="false"
atributo com:<uses-feature android:name="android.hardware.camera" android:required="false"></uses-feature>
Bitmap photo = (Bitmap) data.getExtras().get("data");
não captura a imagem que foi tirada. Ele pega uma miniatura da imagem que foi tirada.Atualização (2020)
Google acrescentou uma nova
ActivityResultRegistry
API que "permite-lhe lidar com ostartActivityForResult()
+onActivityResult()
, bem comorequestPermissions()
+onRequestPermissionsResult()
flui sem substituir métodos em sua atividade ou fragmento, traz maior segurança Tipo de viaActivityResultContract
, e fornece ganchos para testar esses fluxos" - fonte .A API foi adicionada no androidx.activity 1.2.0-alpha02 e androidx.fragment 1.3.0-alpha02 .
Agora você pode fazer algo como:
Dê uma olhada na documentação para saber como usar a nova API de resultado da atividade: https://developer.android.com/training/basics/intents/result#kotlin
Existem muitos ActivityResultContracts internos que permitem fazer diferentes coisas, como escolher contatos, solicitar permissões, tirar fotos ou gravar vídeos. Você provavelmente está interessado no ActivityResultContracts.TakePicture mostrado acima.
Note-se que androidx.fragment 1.3.0-alpha04 despreza o
startActivityForResult()
+onActivityResult()
erequestPermissions()
+onRequestPermissionsResult()
APIs no fragmento. Portanto, parece queActivityResultContracts
é a nova maneira de fazer as coisas a partir de agora.Resposta original (2015)
Levei algumas horas para fazer isso funcionar. O código é quase uma cópia e colagem de developer.android.com , com uma pequena diferença.
Solicite esta permissão no
AndroidManifest.xml
:No seu
Activity
, comece definindo isto:Em seguida, dispare isso
Intent
em umonClick
:Adicione o seguinte método de suporte:
Então receba o resultado:
O que o fez funcionar é o
MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath))
, que é diferente do código de developer.android.com . O código original me deu aFileNotFoundException
.fonte
android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/JPEG_20180823_102340_722874009725833047.jpg exposed beyond app through ClipData.Item.getUri()
. Alguma ideia de como consertar isso? @AlbertVilaCalvostorageDir = Context.getFilesDir();
no lugar do arquivostorageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES);
. Caso contrário, eu estava recebendo um erro de permissão negada.Capturar foto + Escolha na Galeria:
fonte
ResultCode == 1
dentroResultCode == RESULT_OK
?requestCode==1
, ajuda a identificar quem iniciou a solicitação.Eu sei que é um segmento bastante antigo, mas todas essas soluções não foram concluídas e não funcionam em alguns dispositivos quando o usuário gira a câmera porque os dados no onActivityResult são nulos. Então, aqui está a solução que eu testei em muitos dispositivos e não enfrentei nenhum problema até agora.
Primeiro, declare sua variável Uri em sua atividade:
Em seguida, crie sua pasta temporária para armazenar a imagem capturada e tente capturar imagens pela câmera:
E agora, aqui está uma das coisas mais importantes, você precisa salvar seu uriFilePath no onSaveInstanceState, porque se você não fizer isso e o usuário girar o dispositivo enquanto estiver usando a câmera, seu uri será nulo.
Depois disso, você sempre deve recuperar sua uri no método onCreate:
E aqui vem a última parte para colocar seu Uri no onActivityResult:
PS Não se esqueça de adicionar permissões para Camera e Ext. gravação de armazenamento para o seu manifesto.
fonte
Aqui você pode abrir a câmera ou galeria e definir a imagem selecionada na visualização de imagens
Adicionar permissões no manifesto
Em onCreate ()
Mostrar caixa de diálogo de opções (para selecionar imagem da câmera ou galeria)
Obter foto da Galeria
Obter foto da câmera
Depois que a imagem for selecionada ou capturada,
Agora é hora de guardar a foto
Solicitar permissão
fonte
Você precisa ler sobre a câmera . (Acho que, para fazer o que você quiser, você terá que salvar a imagem atual no seu aplicativo, selecionar / excluir lá e, depois, chamar a câmera para tentar novamente, em vez de tentar novamente diretamente dentro da câmera.)
fonte
Aqui está o código que usei para capturar e salvar a imagem da câmera e depois exibi-la na visualização de imagem. Você pode usar de acordo com sua necessidade.
Você deve salvar a imagem da câmera em um local específico, buscar nesse local e convertê-lo em matriz de bytes.
Aqui está o método para abrir a captura de atividade de imagem da câmera.
seu método onActivityResult () deve ser assim.
Aqui está o método getBitmap () usado em onActivityResult (). Fiz todas as melhorias de desempenho possíveis ao obter o bitmap da imagem de captura da câmera.
Espero que ajude!
fonte
Capture fotos da câmera + escolha uma imagem da galeria e defina-a como plano de fundo do layout ou da visualização de imagens. Aqui está o código de exemplo.
fonte
Em Atividade:
no layout.xml:
no manifest.xml:
fonte
Você pode usar a câmera personalizada com imagem em miniatura. Você pode olhar o meu projeto .
fonte
Criei uma caixa de diálogo com a opção de escolher Imagem na galeria ou câmera. com um retorno de chamada como
Inicialmente, definimos a permissão no AndroidManifest, pois precisamos gravar armazenamento externo ao criar um arquivo e ler imagens da galeria
Crie um xml file_paths em app / src / main / res / xml / file_paths.xml
com caminho
Em seguida, precisamos definir o fornecedor de arquivos para gerar a interface do usuário para acessar o arquivo armazenado no armazenamento externo
Layout do Diário
ImagePicker Dailog
}
Chamar Atividade ou fragmento como este Definir ImagePicker em Fragmento / Atividade
Em seguida, ligue para dailog clicando no botão
fonte
Aqui está o código completo:
Lembre-se de adicionar permissões para a câmera também.
fonte
Você pode usar esse código para o ouvinte do onClick (você pode usar o ImageView ou o botão)
Para exibir no seu imageView
Nota: insira isso no manifesto
fonte
Use o código a seguir para capturar imagens usando sua câmera móvel. Se você estiver usando o Android com versão superior a Lolipop, adicione a solicitação de permissão também.
fonte
Bitmap photo = (Bitmap) data.getExtras().get("data");
obtém uma miniatura da câmera. Há um artigo sobre como armazenar uma imagem no armazenamento externo da câmera. link útilfonte
Por favor, siga este exemplo com esta implementação usando o suporte Kotlin e Andoirdx:
E o resultado da atividade:
Você pode obter mais detalhes em https://github.com/joelmmx/take_photo_kotlin.git
Espero que ajude você!
fonte