Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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 ?