Solucionado (ver solução)
Solucionado
(ver solução)
26
respostas

Erro retorno câmera.

Utilizando apenas o recurso da câmera mostrado na aula do curso, ao tirar uma foto o retorno vem informando que o caminho da foto é nulo, sendo que ao visualizar no log o caminho existe.

Permissões:

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


public static final int CODIGO_CAMERA = 567;
private String caminhoFoto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send__email);

        Button camera = (Button) findViewById(R.id.camera);
        camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                File arquivoFoto = new File(caminhoFoto);
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                startActivityForResult(intentCamera, CODIGO_CAMERA);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == Activity.RESULT_OK){
            if(requestCode == CODIGO_CAMERA){
                carregaImagem(caminhoFoto);
            }
        }
    }

    private void carregaImagem(String caminhoFoto) {
        Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);
        Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 300,300, true);

        LinearLayout lista = (LinearLayout) findViewById(R.id.previewFoto);

        ImageView foto = new ImageView(this);
        foto.setImageBitmap(bitmapReduzido);
        foto.setScaleType(ImageView.ScaleType.FIT_XY);

        lista.addView(foto);
    }

O erro: java.lang.RuntimeException: Unable to resume activity {Package.com.test/Package.com.test.Send_Email}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=567, result=-1, data=null} to activity {Package.com.test/Package.com.test.Send_Email}: java.lang.NullPointerException: println needs a message

26 respostas

Ola Gabriel, tudo bem ?

Cara, tenta fazer isso e testa para gente por favor :

String caminhoFoto = "";

Pois a String ser vazia é diferente dela estar nula, receio que o seu problema é esse.

Outro ponto que estou um pouco preocupado é a maneira que você está inserindo o ImageView na tela, contudo mantenha dessa forma por enquanto, caso o problema seja nele vamos corrigir.

Abraços

Desta forma em que me indicou o erro é informado.

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: : open failed: ENOENT (No such file or directory)
10-03 09:56:54.081 20235-20235/Package.com.test D/AndroidRuntime: Shutting down VM
10-03 09:56:54.091 20235-20235/Package.com.test E/AndroidRuntime: FATAL EXCEPTION: main
                                                                     Process: Package.com.test, PID: 20235
                                                                     java.lang.RuntimeException: Unable to resume activity {Package.com.test/Package.com.test.Send_Email}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=567, result=-1, data=null} to activity {Package.com.test/Package.com.test.Send_Email}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference.

A forma em que estou inserindo a imagem no LinearLayout é apenas para mostrar um preview das fotos que estão sendo tiradas.

Gabriel,

Aparentemente está tudo correto.

você está usando o emulador ou em um celular real ?

Celular LG L90

A foto você está tirando em paisagem ou retrato ?

Testei nas duas posições. Devo setar a orientação no Manifest?

Gabriel,

Tenta tirar a foto sem rotacionar o seu aparelho.

Pois toda vez que rotacionamos, o Android vai encerrar e criar uma nova Activity, quando ele faz esse processo ele acaba perdendo todas as referências que passamos para ele.

Abraço

Mesmo sem rotacionar o aparelho o erro persiste. W/ContextImpl: Failed to ensure directory: /storage/external_SD/Android/data/Package.com.test/files 10-03 10:50:16.661 4165-4165/Package.com.teste I/CAMINHO: /storage/emulated/0/Android/data/Package.com.test/files/1475506216674.jpg

olhando no log é eu pedi para mostrar o caminho e ao que percebo esse caminho não existe de fato. É criado algum local temporário para essa foto?

Gabriel,

Você tem um cartão de memoria certo ?

E além disso, qual é a versão do Android do seu celular ?

não estou utilizando cartão de memória, minha versão do android é 5.0.2

porém todas as imagens estão sendo salvas na galeria e em alguns testes que realizei no meu celular a foto aparece no preview na maioria das vezes a aplicação encerra.

Oi Gabriel tenta assim:

substitui

caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";

por

caminhoFoto =   "/storage/external_SD/Android/data/" + System.currentTimeMillis() + ".jpg";

E comenta aí como foi. Fico no aguardo.

Ela aparece e depois o aplicativo quebra ?

É isso que está acontecendo ?

Matheus, Quando a foto aparece no preview logo a app quebra, mas são raras as vezes que ela aparece.

Maison, Olhei na galeria e substitui o caminho pelo local onde as fotos estão sendo salvas ao ai tentar tirar a foto, o sistema avisa que não há espaço no microSD (não estou usando microSD)

O método getExternalFilesDir(null) retorna o caminho absoluto para armazenar os arquivos, dando preferência ao sd, caso não tenha sd, ele guarda na memória principal.

Como ele está mostrando a foto e a salvando o problema não é na hora de tirar a foto.

Vamos fazer igual está no curso, invés de você adicionar uma view manualmente, segue igual no exercício.

Definindo o ImageView no próprio layout, só para ter certeza que não está quebrando nessa transição.

Além disso, você consegue tentar pegar a Exception que está sendo exibida para ti ?

De acordo com alterações me pediu para fazer eu fiz e o caminho que a foto foi salva é: /storage/emulated/0/DCIM/Camera/1475519188528.jpg

A exception foi:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: : open failed: ENOENT (No such file or directory)
10-03 14:27:47.945 1155-1155/Package.com.test D/AndroidRuntime: Shutting down VM
10-03 14:27:47.965 1155-1155/Package.com.test E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: Package.com.test, PID: 1155
                                                                   java.lang.RuntimeException: Unable to resume activity {Package.com.test/Package.com.test.Send_Email}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=567, result=-1, data=null} to activity {Package.com.test/Package.com.test.Send_Email}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3026)

porém o ImageView não recebeu a foto na activity.

 Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);
        Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 300,300, true);
        imagem.setImageBitmap(bitmapReduzido);
        imagem.setScaleType(ImageView.ScaleType.FIT_XY);

FileNotFoundException significa que ele não está encontrando o arquivo.

O que encadeia um NullPointerException, no momento que ele vai diminuir a imagem, como não a encontrou a referencia é nula, logo quando ele pega o null e tenta invocar um método, levamos a exception.

Consegue validar se a foto realmente está nesse endereço ?

Sim o diretório é este mesmo, pude notar agora que o nome da foto que mostra no Log não é o mesmo da imagem salva. Por exemplo esta que te mandei na conversa acima tem nome 1475519188528.jpg e na galeira o nome dela é 201610003_135719.jpg

O problema está ai, aparentemente seu celular não está reconhecendo o comando que falamos para ele salvar com o nome que queremos e ele salva da maneira padrão.

Nisso no momento em que buscamos a foto, ele não encontra já que realmente o arquivo que ele está indo buscar não existe em memória.

Realizei alguns testes e constatei que este exemplo que fiz de acordo com o que está na aula só está disponível para android nas versões iguais ou inferiores a 4.4.2, estas obtiveram sucesso nos testes. Ad versões superiores nenhuma funcionou. Testei em celulares LG e SAMSUNG.

Oi Gabriel, eu estou fazendo esse curso essa semana e travei exatamente nessas exceptions o curso ao que parece foi feito em cima do emulador e com a API 23, no emulador a minha aplicação funcionou, mas quando rodei direto no meu celular que usa API 16 não rodou, inseri alguns breakpoints e descobri que no meu celular o getExternalFilesDir(null) estava dando null/xxxxxx.jpg o que dava esse nullpoint a seguir. Então vi um caminho do meu cartão sd e substitui ao invés de pegar o caminho eu dei o caminho só pra verificar se ia funcionar e funcionou.

Por isso já estava certo de que funcionaria pra você também. Mas então vamos lá, você disse que não tem cartão de memória, então faria assim salvaria na memória do dispositivo, eu não tenho como saber como ta organizado sua estrutura de pastas, mas aqui no meu poderia ser algo como:

caminhoFoto =   "/storage/sdcard0/Android/data/" + System.currentTimeMillis() + ".jpg";

Pra tentar entender pq não roda no dispositivo, Insere alguns breakpoints la no teu Listener pra ver onde acontece o erro, se passa da Listener põe no onActivityResult e no carregaImagem. Precisamos monitorar esse caminhoFoto. Aqui consegui fazer funcionar no emulador e no dispositivo(API 16 e API 22). Veja aí se consegue.

Gabriel,

Eu tenho um Samsung e este exemplo funciona sem nenhum problema.

Alguma coisa no código, que ainda não vimos está dando este problema.

Posta a classe completa aqui para analisarmos, por favor.

package Package.com.test;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

import java.io.File;

public class Send_Email extends AppCompatActivity {

    public static final int CODIGO_CAMERA = 567;
    private String caminhoFoto = "";
    private ImageView imagem = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send__email);


        imagem = (ImageView) findViewById(R.id.imagem);
        Button camera = (Button) findViewById(R.id.camera);
        camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                Log.i("CAMINHO",caminhoFoto);
                File arquivoFoto = new File(caminhoFoto);
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                startActivityForResult(intentCamera, CODIGO_CAMERA);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == Activity.RESULT_OK){
            if(requestCode == CODIGO_CAMERA){
                carregaImagem(caminhoFoto);
            }
        }
    }

    private void carregaImagem(String caminhoFoto) {

        Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);
        Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 300,300, true);

        LinearLayout lista = (LinearLayout) findViewById(R.id.previewFoto);

        ImageView foto = new ImageView(this);
        foto.setImageBitmap(bitmapReduzido);
        foto.setScaleType(ImageView.ScaleType.FIT_XY);

        lista.addView(foto);
    }

}

Matheus conseguiu encontrar algum erro?

Oi Gabriel conseguiu resolver essa questão ?

solução!

Oi Gabriel, caso persista alguma dúvida a respeito desse exercício ou curso pode perguntar aqui mesmo ou se você não tiver mais nenhuma dúvida a respeito você pode marcar uma resposta como solução, finalizando assim esse tópico.Espero ter ajudado. Bons estudos.