Bom Dia Pessoal. Estou com um pequeno problema. Quando tiro a foto e ao mostrar no aplicativo, a foto está saindo em modo paisagem. Para aparecer corretamente tenho que tirar a foto virando o celular. Como faço para sair corretamente ?
Grato ...
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!
Bom Dia Pessoal. Estou com um pequeno problema. Quando tiro a foto e ao mostrar no aplicativo, a foto está saindo em modo paisagem. Para aparecer corretamente tenho que tirar a foto virando o celular. Como faço para sair corretamente ?
Grato ...
Olá William,
Esse é um problema comum no desenvolvimento Android e a forma de corrigir está detalhada em um post que escrevemos no blog da Alura. Lá você vai encontrar a explicação do que está acontecendo e também o código de uma classe para te ajudar a resolver o problema. Segue o link:
http://blog.alura.com.br/como-corrigir-a-orientacao-das-fotos-no-android/
Bom Dia Jeferson:
Obrigado pela dica. Fiz aqui e deu certo. Só ficou uma dúvida agora. Tirei a foto, posicionou corretamente mas a foto ficou bem achatada (em modo normal). Se eu tirar a foto em paisagem ela aparece correta. Tem algo q da para melhorar ?
Grato ...
Olá William,
Isso acontece porque no nosso formulário estamos mantendo o tamanho da foto fixo. Nesse caso, como estamos pedindo para o Android preencher todo o conteúdo do ImageView com a foto então as proporções da foto ficarão incorretas.
Você pode alterar o seu layout para que a ImageView mude de tamanho de acordo com o tamanho e orientação da foto. Para isso você pode setar a largura como match_parent, a altura como wrap_content e a propriedade adjustViewBounds como true para avisarmos que a imagem deve se redimensionar de acordo com o conteúdo.
<ImageView
android:adjustViewBounds="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Bom Dia Jeferson:
Fiz os testes e agora estou com um problema que não consigo decifrar o que é. Até baixei o seu exemplo mas não deu certo também. Está dando um NullPointer bem no momento doBitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 300, 300, true);
O decodeFile está retornando null para o bitmap: Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto); // retorna null
O caminhoFoto tem o conteúdo normal. Segue o erro:
04-23 11:11:52.412 24851-24851/br.com.alura.agenda E/AndroidRuntime: FATAL EXCEPTION: main Process: br.com.alura.agenda, PID: 24851 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=567, result=-1, data=null} to activity {br.com.alura.agenda/br.com.alura.agenda.FormularioActivity}: java.lang.NullPointerException at android.app.ActivityThread.deliverResults(ActivityThread.java:3387) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3430) at android.app.ActivityThread.access$1300(ActivityThread.java:142) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1251) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5118) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:597) at br.com.alura.agenda.FormularioHelper.carregaImagem(FormularioHelper.java:66) at br.com.alura.agenda.FormularioActivity.onActivityResult(FormularioActivity.java:61) at android.app.Activity.dispatchActivityResult(Activity.java:5467) at android.app.ActivityThread.deliverResults(ActivityThread.java:3383) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3430) at android.app.ActivityThread.access$1300(ActivityThread.java:142) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1251) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5118) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) at dalvik.system.NativeStart.main(Native Method)
Obrigado ...
Olá William,
Posta aqui o código da sua FormularioActivity pra gente tentar descobrir o que está acontecendo.
Bom Dia:
Segue código.
package br.com.alura.agenda;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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 java.io.File;
import br.com.alura.agenda.dao.AlunoDAO;
import br.com.alura.agenda.modelo.Aluno;
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);
helper = new FormularioHelper(this);
Intent intent = getIntent();
Aluno aluno = (Aluno) intent.getSerializableExtra("aluno");
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) {
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);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == CODIGO_CAMERA) {
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();
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
public void preencheFormulario(Aluno aluno) {
campoNome.setText(aluno.getNome());
campoEndereco.setText(aluno.getEndereco());
campoTelefone.setText(aluno.getTelefone());
campoSite.setText(aluno.getSite());
campoNota.setProgress(aluno.getNota().intValue());
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);
}
}