2
respostas

API 16 faltal erro Camera

Apos fazer a atualiazação do codigo para atender a versão 7.0. O meu app quebra agora no API 16.

FATAL EXCEPTION: main java.lang.IllegalArgumentException: Failed to find configured root that contains /null/1500061371394.jpg at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)

2 respostas

Olá Av,

A princípio o código deveria funcionar mesmo na API 16 então vamos precisar investigar um pouco o código para tentarmos descobrir a causa do problema.

Quando o erro está acontecendo? É logo que você tenta chamar a câmera ou depois que você tira a foto e volta para o aplicativo?

Para já ir adiantando, posta aqui também o código da sua classe que faz a manipulação da câmera e também o seu AndroidManifest.xml, por favor.

Eu tentei rodar no meu celular, com android 7.0 e me deparei com o FileUriExposedException, depois vi que tinha uma parte explicando como implementar o provider. Só que agora, ele crasha antes mesmo de abrir a câmera, e lança a seguinte exceção: java.lang.IllegalArgumentException: Failed to find configured root that contains (caminho específico) Consegui resolver esse problema mudando no meu provider_paths.xml

<external-path name="external_files" path="."/>

para

<external-files-path name="external_files" path="."/>

E agora a câmera abre, porém crasha antes de voltar para a activity do formulario, e lança a seguinte exceção:

 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=123, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.recdev.daviv.agendaalunos/com.recdev.daviv.agendaalunos.FormularioActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference

Gostaria de saber como resolver este problema. Obrigado desde já. Segue minha classe do formulário, meu AndroidManifest, e o provider_paths:

package com.recdev.daviv.agendaalunos;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.Image;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;

import com.recdev.daviv.agendaalunos.Model.Aluno;
import com.recdev.daviv.agendaalunos.dao.AlunoDAO;

import java.io.File;
import java.util.zip.Inflater;

public class FormularioActivity extends AppCompatActivity {


    public static final int REQUEST_CODE_CAMERA = 123;
    private FormularioHelper helper;
    private Button botaoFoto;
    private ImageView fotoUser;
    private String caminhoFoto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario);
        helper = new FormularioHelper(this);

        //recuperar os dados amarrados na intent
        Intent intent = getIntent();
        Aluno aluno = (Aluno) intent.getSerializableExtra("aluno");
        if(aluno != null){
            helper.fillForm(aluno);
        }

        botaoFoto = (Button) findViewById(R.id.formulario_imagem_botao);

        botaoFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg"; //cria um padrão de path
                File arquivoFoto = new File(caminhoFoto);//cria um objeto arquivo
                Uri photoUri = FileProvider.getUriForFile(getApplicationContext(), "com.recdev.daviv.agendaalunos.provider", arquivoFoto);//cria uri do arquivo
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); //indica a chave e a Uri do arquivo para salvar a foto
                startActivityForResult(intentCamera, REQUEST_CODE_CAMERA);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(data != null){
            if(requestCode == REQUEST_CODE_CAMERA && resultCode != Activity.RESULT_CANCELED){
                fotoUser = (ImageView) findViewById(R.id.formulario_imagem);

                Bitmap imagemBitmap = BitmapFactory.decodeFile(caminhoFoto);
                Bitmap bitmapProcessed = Bitmap.createScaledBitmap(imagemBitmap, 150 , 150, true);
                fotoUser.setImageBitmap(bitmapProcessed);
                fotoUser.setScaleType(ImageView.ScaleType.FIT_XY);
                fotoUser.setTag(caminhoFoto);
            }
        }
    }

    //método que cria um menu na barra ao criar a activity
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //inflater pega o XML do menu, e infla no Layout da activity
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_formulario, menu);

        return super.onCreateOptionsMenu(menu);
    }

    //método que trata os cliques nos itens do menu
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch(item.getItemId()){
            case R.id.menu_formulario_ok:

                Aluno aluno = helper.getAluno();
                AlunoDAO dao = new AlunoDAO(this);

                if(aluno.getId() != null){
                    dao.updateAluno(aluno);
                    dao.close();
                }else{
                    dao.insert(aluno);
                    dao.close();

                }
                Toast.makeText(FormularioActivity.this,"Aluno " +aluno.getNome() + " salvo!", Toast.LENGTH_SHORT).show();
                finish();
                break;
        }

        return super.onOptionsItemSelected(item);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.recdev.daviv.agendaalunos">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.recdev.daviv.agendaalunos.provider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

        <activity android:name=".FormularioActivity">
        </activity>
        <activity android:name=".ListaAlunosActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

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

    <external-files-path name="external_files" path="."/>

</paths>