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

Erro com a chamada da câmera

Olá, Criei uma classe especializada em usar os métodos da câmera para poder utilizá-la em todo meu projeto. Eu montei a intent para chamar a câmera e funcionou legal, faz a chamada implícita e a câmera abre, porém no metodo onActivityResult, o resultCode está vindo -1 e a intent vem vazia.

Está faltando algum parâmetro nessa chamada?

Obrigado

 public void takePhoto() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File imageFile = getPicture();

        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
        if (activity != null)
            activity.startActivityForResult(cameraIntent, Constants.CAMERA_REQUEST);
        if (fragment != null)
            fragment.getActivity().startActivityForResult(cameraIntent, Constants.CAMERA_REQUEST);
    }

    private File getPicture() {

        File directory = fragment.getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);

        SimpleDateFormat sdf = new SimpleDateFormat(Constants.IMAGE_DATE_FORMAT);
        String timestamp = sdf.format(new Date());

        File myPhoto = new File(directory, Constants.IMAGE_NAME + timestamp + ".jpg");

        return myPhoto;
    }
9 respostas

Erickson Takano , tudo bem ?

Seu código ficou bem bacana.. o problema talvez esteja no seu método getPicture().

Quando você faz o fragment.getActivity().getExternalFilesDir()

Pode ser que o fragment esteja nulo.

Para resolver isso e facilitar um pouco sua vida, entre fragment e activity, vamos usar a classe Context, pois é ela que possui o método que irá navegar entre as activities.

Provavelmente você tem dois construtores, um para activity e outro para fragment. Voce vai possuir apenas um e fazer a substituição no codigo.

Além disso, a constante : Constants.IMAGE_NAME pode não estar com "/" no final.

Espero ter te ajudo :D

Olá Matheus, tudo bem?

Fiz as alterações que você sugeriu, porém o erro persiste.

o erro que o console mostra é esse:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1010, result=-1, data=null} to activity {br.com.leiamaisapp.leiamais/br.com.leiamaisapp.leiamais.Views.Common.MainWindowActivity}: java.lang.NullPointerException

No modo debug consigo ver que ele não está com o contexto vazio e que a activity, que agora estou trazendo do contexto, está sendo inicializada corretamente...

A chamada de teste está vindo de um fragmento, pois é onde mais vou precisar, mas estou usando o método onActivityResult na activity prinicipal. Ele está carregando esse método, porém com o erro acima mencionado.

Obrigado.

Tenta fazer dessa forma, deve ajudar um pouquinho :


    public String inicia(Activity activity, int CODE) {

        String arquivoFoto = activity.getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
        File localFoto = new File(arquivoFoto);

        Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(localFoto));
        activity.startActivityForResult(camera, CODE);


        return arquivoFoto;
    }

Ai na sua activity ou fragment você tem acesso ao método onActivityResult para tratar o resultado

Então, eu estava passando a activity como parâmetro do construtor, porém, apesar do método onActivityResult estar rodando na volta da câmera, a intent vem nula.

Procurei na internet e descobri que pelo context eu conseguia iniciar a activity na classe, e realmente funcionou da mesma forma, porém o erro continua no onActivityResult.

Com as alterações, a classe ficou assim:

public class ImageEvents {

    public ImageEvents(Context context) {
        this.context = context;
        activity = (Activity) context;
    }

    private Context context;
    private Activity activity;

     public void takePhoto() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File imageFile = getPicture();

        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));

        activity.startActivityForResult(cameraIntent, Constants.CAMERA_REQUEST);
    }

    private File getPicture() {
        File directory = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);

        SimpleDateFormat sdf = new SimpleDateFormat(Constants.IMAGE_DATE_FORMAT);
        String timestamp = sdf.format(new Date());

        File myPhoto = new File(directory, Constants.IMAGE_NAME + timestamp + ".jpg");

        return myPhoto;
    }
}

e o método onActivityResult:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Toast.makeText(
                getBaseContext(),
                data.getAction().toString(),
                Toast.LENGTH_LONG
                ).show();
    }

Só mandei dar um Toast para ver o que a câmera estava retornando, porém, como está escrito na exception, a data está nula.

Por que a câmera está me retornando parâmetros nulos?

Você não precisa mexer com a intent que recebe da camera, por isso que mantemos o caminho da foto...

Como ela não está te devolvendo nenhuma informação, apenas se deu certo ou não a intent será nula.

E o resultCode -1 não significa erro?

solução!

Na verdade temos constantes que nos ajudam, por isso fazemos aquele if verificando se o resultado foi OK.

O -1 na documentação representa que deu ok :

https://developer.android.com/reference/android/app/Activity.html#RESULT_OK

Espero ter ajudado :D

Ah, legal.

Obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software