Eu tenho um aplicativo Android que contém várias atividades.
Em um deles, estou usando um botão que chamará a câmera do dispositivo:
public void onClick(View view) {
Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(photoIntent, IMAGE_CAPTURE);
}
Na mesma atividade, chamo o OnActivityResult
método para o resultado da imagem:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.pic);
imageview.setImageBitmap(image);
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
}
}
}
O problema é que a intenção data
é nula e o OnActivityResult
método se volta diretamente para (resultCode == RESULT_CANCELED)
o aplicativo e retorna à avtividade anterior.
Como posso corrigir esse problema e, depois de ligar para a câmera, o aplicativo retorna à atividade atual que contém uma ImageView
que contém a foto tirada?
obrigado
android
android-camera
android-imageview
soft_developer
fonte
fonte
Respostas:
O aplicativo de câmera padrão do Android retorna uma intenção não nula somente ao retornar uma miniatura na intenção retornada. Se você passar
EXTRA_OUTPUT
com um URI para gravar, ele retornará umanull
intenção e a imagem estará no URI que você transmitiu.Você pode verificar isso consultando o código-fonte do aplicativo da câmera no GitHub:
https://github.com/android/platform_packages_apps_camera/blob/gingerbread-release/src/com/android/camera/Camera.java#L1186
Eu acho que você está passando de
EXTRA_OUTPUT
alguma forma ou o aplicativo da câmera no telefone funciona de maneira diferente.fonte
Eu encontrei uma resposta fácil. funciona!!
se você deseja cortar e dimensionar esta imagem
fonte
FileUriExposedException
versões modernas do SDK.Eu já tive esse problema, o
intent
não é nulo, mas as informações enviadas por eleintent
não são recebidas emonActionActivit()
Esta é uma solução melhor usando getContentResolver () :
a
onActivityResult()
obter um bitmap armazenado por getContentResolver () :Veja meu exemplo no github:
https://github.com/Jorgesys/TakePicture
fonte
Aplicativo de câmera de trabalho simples, evitando o problema de intenção nula
- todo o código alterado incluído nesta resposta; perto do tutorial android
Como já gastei muito tempo com esse problema, decidi criar uma conta e compartilhar meus resultados com você.
O tutorial oficial para o Android "Tirar fotos com simplicidade" acabou não cumprindo o que prometia. O código fornecido não funcionava no meu dispositivo: um Samsung Galaxy S4 Mini GT-I9195 executando a versão android 4.4.2 / KitKat / API Level 19.
Eu descobri que o principal problema era a seguinte linha no método chamado ao capturar a foto (
dispatchTakePictureIntent
no tutorial):Resultou na intenção posteriormente capturada por
onActivityResult
ser nula.Para resolver esse problema, tirei muita inspiração das respostas anteriores aqui e de alguns posts úteis no github (principalmente este do deepwinter - muito obrigado a ele; você também pode conferir a resposta dele em um post estreitamente relacionado ).
Seguindo esses conselhos agradáveis, escolhi a estratégia de excluir a
putExtra
linha mencionada e fazer o correspondente para recuperar a foto tirada da câmera no método onActivityResult (). As linhas de código decisivas para recuperar o bitmap associado à imagem são:Eu criei um aplicativo exemplar que apenas tem a capacidade de tirar uma foto, salvá-lo no cartão SD e exibi-lo. Acho que isso pode ser útil para pessoas na mesma situação que eu quando me deparei com esse problema, já que as sugestões de ajuda atuais se referem principalmente a postagens bastante extensas no github que fazem a coisa em questão, mas não são fáceis de supervisionar para iniciantes como mim. Com relação ao sistema de arquivos que o Android Studio cria por padrão ao criar um novo projeto, eu apenas precisei alterar três arquivos para o meu propósito:
activity_main.xml:
MainActivity.java:
AndroidManifest.xml:
Observe que a solução que encontrei para o problema também levou a uma simplificação do arquivo de manifesto do Android: as alterações sugeridas pelo tutorial do Android em termos de adição de um provedor não são mais necessárias, pois não estou usando nenhum código do meu java. Portanto, apenas algumas linhas padrão - principalmente em relação às permissões - tiveram que ser adicionadas ao arquivo de manifesto.
Além disso, pode ser valioso ressaltar que a importação automática do Android Studio pode não ser capaz de lidar
java.text.SimpleDateFormat
ejava.util.Date
. Eu tive que importar os dois manualmente.fonte
Provavelmente porque você tinha algo assim?
No entanto, você não deve colocar a saída extra na intenção, porque os dados serão inseridos no URI em vez da variável de dados. Por esse motivo, você deve seguir as duas linhas no meio, para ter
Foi isso que causou o problema para mim, espero que tenha ajudado.
fonte
O código a seguir funciona para mim:
E aqui está o resultado:
fonte
imageReturnedIntent.getData()
valor nulo. Estou criando a mesma intenção que a sua. Não colocou nenhum parâmetro extra.Para acessar a câmera, tirar fotos e definir o ImageView no Android
Você tem que usar
Uri file = Uri.fromFile(getOutputMediaFile());
para marshmallow.Use o link abaixo para obter o caminho
https://androidkennel.org/android-camera-access-tutorial/
fonte
Código Kotlin que funciona para mim:
E obtenha resultado:
e não se esqueça de declarar o código de solicitação:
fonte
Depois de muitas tentativas e estudos, consegui descobrir. Primeiro, os dados variáveis do Intent sempre serão nulos; portanto, a verificação
!null
travará seu aplicativo enquanto você passar um URI para startActivityForResult. Siga o exemplo abaixo. Eu vou estar usando Kotlin.Abra a intenção da câmera
} `
Crie o createImageFile (), mas você DEVE tornar a variável imageFilePath global. Exemplo de como criá-lo está na documentação oficial do Android e é bastante direto
Obter intenção
O método getBytesFromBitmap
Eu espero que isso ajude.
fonte
Quando vamos capturar a imagem da câmera no Android, em seguida, Uri ou
data.getdata()
vem nulo. Temos duas soluções para resolver esse problema.Implementarei todos os métodos aqui. Observe e leia com atenção:
Primeiro vou dizer como obter o Uri da imagem de bitmap: O código completo é:
Primeiro capturaremos a imagem através do Intent que será igual para os dois métodos, portanto, este código eu escreverei uma vez apenas aqui:
Agora vamos implementar OnActivityResult :-( Isso será o mesmo para os dois métodos acima): -
Agora, criaremos todo o método acima para criar Uri a partir dos métodos Image e Cursor por meio de classes:
Agora caminho URI da imagem de bitmap
\ Uri do caminho real da imagem salva
fonte
Quando capturar a imagem da câmera no Android, em seguida,
Uri
oudata.getdata()
torna-se nulo. Temos duas soluções para resolver esse problema.Isto é como recuperar o Uri da imagem de bitmap. Primeiro capture a imagem através do Intent que será a mesma para os dois métodos:
Agora implemente
OnActivityResult
, que será o mesmo para os dois métodos:Agora crie todos os métodos acima para criar os métodos Uri a partir de imagem e cursor:
Caminho de Uri da imagem de bitmap:
Uri do caminho real da imagem salva:
fonte