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

Aplicação da câmera não retorna para a Agenda

O app agenda chama a câmera, que no meu caso é emulada. Pois a câmera do notebook não é acessada de modo algum pelo AVD Nexus_6_API_23. Pois bem o app agenda chama aplicação Camera do AVD, que tem um comportamento totalmente diferente se fosse chamado diretamente. Ao ser chamado indiretamente pelo app agenda o aplicativo agenda não mostra que salvou a foto, apenas mostra a foto/imagem congelada da animação da emulação na posição do momento do clique e mostra apenas um X para fechar, a seta curvada do restart camera e o V de confirmação para salvar a foto. O V não responde de modo algum.Já li várias tópicos tratando de problemas com a câmera. Mas nenhum resolve o meu caso.

Em seguida postarei os códigos fontes.

9 respostas

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.specialprojects.agenda2">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ListaAlunosActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".FormularioActivity"
            android:label= "@string/Formulario">


        </activity>


    </application>

</manifest>

FormularioHelper.java

package com.specialprojects.agenda2;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RatingBar;

import com.specialprojects.agenda2.modelo.Aluno;

/**
 * Created by romullokss on 12/12/2017.
 */

public class FormularioHelper {
    private final EditText campoNome;
    private final EditText campoEndereco;
    private final EditText campoFone;
    private final EditText campoSite;
    private final RatingBar campoNota;
    private final ImageView campoFoto;
    private Aluno aluno;


    public FormularioHelper(FormularioActivity activity){
         campoNome= (EditText)activity.findViewById(R.id.formulario_nome);
         campoEndereco = (EditText)activity.findViewById(R.id.formulario_endereço);
         campoFone = (EditText)activity.findViewById(R.id.formulario_telefone);
         campoSite = (EditText)activity.findViewById(R.id.formulario_site);
         campoNota = (RatingBar)activity.findViewById(R.id.formulario_nota);
         campoFoto = (ImageView)activity.findViewById(R.id.formulario_foto);
         aluno =  new Aluno();
        /*
        String nome = campoNome.getText().toString();
        String endereco = campoEndereco.getText().toString();
        String fone = campoFone.getText().toString();
        String site = campoSite.getText().toString();
        */
    }

    public Aluno pegaAluno() {
        aluno.setNome(campoNome.getText().toString());
        aluno.setEndereco(campoEndereco.getText().toString());
        aluno.setTelefone(campoFone.getText().toString());
        aluno.setSite(campoSite.getText().toString());
        aluno.setNota((double) campoNota.getProgress());
        aluno.setCaminhoFoto((String)campoFoto.getTag());
        return  aluno;
    }

    public void preencheFormulario(Aluno aluno) {
        campoNome.setText(aluno.getNome());
        campoEndereco.setText(aluno.getEndereco());
        campoFone.setText(aluno.getTelefone());
        campoSite.setText(aluno.getSite());
        campoNota.setProgress(aluno.getNota().intValue());
        if (aluno.getCaminhoFoto() != null) {
            carregaImagem(aluno.getCaminhoFoto());
        }

        this.aluno=aluno;
    }

    public void carregaImagem(String caminhoFoto) {
        if(caminhoFoto!=null){
            Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);
            Bitmap bitmapReduzido= Bitmap.createScaledBitmap(bitmap,300,300,true);
            campoFoto.setImageBitmap(bitmapReduzido);
            campoFoto.setScaleType(ImageView.ScaleType.FIT_XY);
            campoFoto.setTag(caminhoFoto);
        }

    }
}

O FormularioActivity.java

package com.specialprojects.agenda2;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.specialprojects.agenda2.dao.AlunoDAO;
import com.specialprojects.agenda2.modelo.Aluno;

import java.io.File;

public class FormularioActivity extends AppCompatActivity {

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario);
        Intent intent = getIntent();
        final Aluno aluno = (Aluno) intent.getSerializableExtra("aluno");
        helper= new FormularioHelper(this);
        if (aluno!=null){
            helper.preencheFormulario(aluno);
        }

        Button botaoFoto =(Button) findViewById(R.id.formulario_botao_foto);
        botaoFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Adquirindo permisão para camemra
                String permissao = Manifest.permission.CAMERA;
                int permitido = PackageManager.PERMISSION_GRANTED;
                if(ActivityCompat.checkSelfPermission(FormularioActivity.this,permissao)!=permitido){
                    ActivityCompat.requestPermissions(FormularioActivity.this,new String[]{permissao},
                            124);

                }else{
                    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);

                }

                //////////////////////



                /*Versão 7
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT,
                        FileProvider.getUriForFile(FormularioActivity.this,
                                BuildConfig.APPLICATION_ID +
                        ".provider",arquivoFoto));
                 */
                //Versão Bugada supostamente para android 6



            }
        });

        /** Não mais preciso
        *  Button botaoSalvar = (Button)findViewById(R.id.formulario_salvar);
        botaoSalvar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });*/
    }

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

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater= getMenuInflater();
        inflater.inflate(R.menu.menu_formulario,menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_formulario_ok:
                Aluno aluno = helper.pegaAluno();
                AlunoDAO dao = new AlunoDAO(this);
                if (aluno.getId()!=null){
                    dao.altera(aluno);
                }else{
                    dao.insere(aluno);
                }
                dao.close();
                Toast.makeText(FormularioActivity.this,
                        "Aluno " + aluno.getNome()+" Salvo!", Toast.LENGTH_SHORT).show();

                //conectar banco
                //salvar o aluno
                //fechar a conexão

                //usar DAO


                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

Consegue mostrar para gente a exception ?

LOGCAT Error

Após sair da câmera apertando o X já que o V não funciona.

02-09 14:43:26.124 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d986e0
02-09 14:43:33.040 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d98960
02-09 14:44:05.194 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d98f00
02-09 14:44:06.160 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d99040
02-09 14:44:42.640 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d992c0
02-09 14:44:44.417 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d99680
02-09 14:45:01.464 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d986e0
02-09 14:45:02.401 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d992c0
02-09 14:45:09.729 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d997c0
02-09 14:45:16.964 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d990e0
02-09 14:45:18.282 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d99360
02-09 14:45:39.387 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d999a0
02-09 14:45:43.741 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d99360
02-09 14:45:52.965 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d99360
02-09 14:45:54.066 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d992c0

Não deu nenhum erro.

Chegou a quebrar seu app ?

Tenta fazer o com o que está quebrando e dá uma olhadinha na exception.

App antes de chamar a câmera: https://cdn.pbrd.co/images/H6R2MEL.png https://cdn.pbrd.co/images/H6R2daY.png

Câmera chamada: https://cdn.pbrd.co/images/H6R3ljz.png Clicado o botão shot: https://cdn.pbrd.co/images/H6R3TcU.png O botão V não responde salvando foto ou retornando para o app agenda.

Apenas reload reinicia a câmera e o X que fecha a câmera retornando para o app agenda sem ter salvo a foto. Logo em seguida temos o 02-09 14:45:54.066 3940-3977/com.specialprojects.agenda2 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9d992c0

O app agenda não trava, não tem crash, continua normalmente sem carregar nenhuma foto.

solução!

Quando você faz :

File arquivoFoto = new File("caminhoFoto");

Está com problema, está passando uma string escrito caminhoFoto e não passando efetivamente a string que é o caminho.

Obrigado professor Matheus Brandino: Não faço a menor idéia do motivo de eu ter colocado as "".

Mas me foi uma boa lição, pois sem crash, é bom desconfiar de defeito na lógica.

A foto foi persistida: https://cdn.pbrd.co/images/H6RnhJe.png

Muito 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