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

Agenda parou

Ao clicar em Salvar a foto a aplicação é encerrada. Realizei teste em dispositivo físico (Android 5.0 Api 21) e dispositivo virtual (Android 6.0 API 23) o mesmo ocorre para os dois ambientes.

As exceções geradas são::

1 - Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Android/data/br.com.cesargiupponi.agenda/files/1487250290606.jpg (No such file or directory)

2 - Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference Essa ultima aponta a seguinte linha

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

no evento onActivityResult.

OBS: Já dei permissão de leitura/escrita no armazenamento externo.

Dados os acontecimentos acima, alguém poderia ajudar?

Grato.

10 respostas

Ola Cesar, tudo bem ?

Sabe o que eu precisava ver ?

O código que você vai para a câmera e o código que você trata a resposta !

Ai consigo ver se tem algo para melhorar.

Abraços

Tudo tranquilo e com vc?

Segue abaixo:

Button btnFoto = (Button) findViewById(R.id.formulario_botao_foto);
        btnFoto.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);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                startActivityForResult(intentCamera, CODIGO_CAMERA);
            }
        });


@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == CODIGO_CAMERA){
            ImageView foto = (ImageView) findViewById(R.id.formulario_foto);
            Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);
            Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap,300,300,true);
            foto.setImageBitmap(bitmapReduzido);
        }
    }

Cesar, uma dica: quando for postar código, utilize o botão "Inserir Código" no cabeçalho da janela de resposta. Dessa forma, o código vem formatado certinho e facilita a leitura, tipo assim:

Button btnFoto = (Button) findViewById(R.id.formulario_botao_foto); 
btnFoto.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); 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto)); 
        startActivityForResult(intentCamera, CODIGO_CAMERA); 
    } 
});

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(requestCode == CODIGO_CAMERA)
    { 
        ImageView foto = (ImageView) findViewById(R.id.formulario_foto); 
        Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto); 
        Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap,300,300,true); 
        foto.setImageBitmap(bitmapReduzido);
     }
 }

Sobre o seu problema: essa variável bitmapReduzido recebe o valor do método Bitmap.createScaledBitmap(), que por sua vez recebe como parâmetro a variável bitmap. Será que essa variável não está vindo nula e dá problema no Bitmap.createScaledBitmap()? Debuga a aplicação e loga o valor dessa variável. Você pode tratar ali também, colocando uma condição se for nula a variável, fazer algo.

Cesar, tudo bem?

Cara você está com problemas porque pode estar tirando uma foto e cancelando e retornando para sua Activity, ai você apenas está validando se foi a sua requisição para que foi executada e em nenhum momento você perguntou se o resultado foi positivo, faltou usar o parâmetro resultCode, validando se ele é Activity.Result_OK lembra disso ?

Faz o teste e fala para gente o que rola.

Abraço

Bruno obrigado pela dica.

Realmente a variável bitmap está ficando nula, estou tentando resolver o problema.

acrescentei a seguinte linha de codigo

if (bitmap == null)
                Toast.makeText(FormularioActivity.this, "Nulo", Toast.LENGTH_SHORT).show();

Esta satisfazendo a condição do if.

Matheus, fiz o que disse ainda persiste o erro.

Abraço.

Dá uma olhadinha em 2 coisas

Agora, você está testando num android com S.O 5 ou 6 ?

Caso seja o 5, vê se no manifest você colocou essa linha :


<manifest>

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

    <!-- outras permissões e a tag application -->

E se for o android 6, lembra de chamar a permissão de maneira explícita para o usuário, igual foi feito com a ligação.

Abraços

Estou usando S.O. 5 e meu arquivo AndroidManifest está assim:

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

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


    <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">
            <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="Formulario">
        </activity>
    </application>

</manifest>

Imagino que o problema todo é o método BitmapFactory.decodeFile que está retornando nulo.

solução!

Encontrei o problema hahah

Button btnFoto = (Button) findViewById(R.id.formulario_botao_foto);
        btnFoto.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);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                startActivityForResult(intentCamera, CODIGO_CAMERA);
            }
        });

Dá uma olhadinha nesse código !

Você cria a Intent que vai iniciar a camera e a chama de intentCamera, certo ? Agora repara onde você está colocando o local onde ele deve armazenar sua foto : em outra referência, que você chamou de intent, ou seja em nenhum momento você falou para a camera onde ela deveria armazenar a foto. Altera a referencia ai e fala para gente se deu certo !

Abraço

Matheus, era exatamente isso. Um erro bobo por falta de atenção.

Funcionou para S.O 5 (API 21) , parece que para targetSdkVersion: 24 ou maior, as regras mudaram, agora não é permitido anexar arquivo com Intent, isto causa uma exceção do tipo FileUriExposedException que pode encerrar a aplicação.

Realmente a exceção acima está ocorrendo comigo, mais irei resolver isso depois, vou continuar trabalhando com o Android 5 por enquanto.

Obrigado pelo apoio.

E isso funciona para versoes abaixo de Android 7.0, API 25, ?? se sim como faz ?

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