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>