Duvida Tirar foto e exibir na aplicação

Olá amigos estou com um problema, usando o codigo abaixo, consigo tirar uma foto e exibi-la em um imageview, o problema é se eu girar a tela do emulador o imageview perde a referencia com a imagem que eu tirei, o mesmo acontece no celular.

Poderia me ajudar a identificar qual o problema?

Obrigado!

package com.example.exemplocamera;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private static final int CAMERA_REQUEST = 1888; 
    private ImageView imageView = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	this.imageView = (ImageView) this.findViewById(R.id.imageView1);
	Button photoButton = (Button) this.findViewById(R.id.button1);
	photoButton.setOnClickListener(new View.OnClickListener() {

	    @Override
	    public void onClick(View v) {
		Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);			
		startActivityForResult(cameraIntent, CAMERA_REQUEST);
	    }
	});
    }
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {  
            Bitmap photo = (Bitmap) data.getExtras().get("data"); 
            imageView.setImageBitmap(photo);
        }  
    } 

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
	getMenuInflater().inflate(R.menu.activity_main, menu);
	return true;
    }
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Foto" >
    </Button>

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" >
    </ImageView>

</LinearLayout>

voce precisa gravar a foto no sd

Seria realmente necessário? Não tem uma alternativa para resolver o problema? Não gostaria de ter que gravar a foto!

creio que sim, guardar a foto e usar um arquivo para guardar o nome da foto, para que pudesse referenciar depois ou em um banco ou em um arquivo mesmo txt.

Até o programa nativo do celular de agenda é gravando no sd. Certo?

já tentou criar um layout paisagem?

É realmente necessário trabalhar com layout paisagem? Se não for, é so tratar o giro.

[quote=fasandes]já tentou criar um layout paisagem?

É realmente necessário trabalhar com layout paisagem? Se não for, é so tratar o giro.[/quote]
Cara não é necessário, seria uma solução travar o girar, mas gostaria de saber como resolver este problema, pois e amanhã? Se for preciso realmente girar a tela e tal, é mais por curiosidade de como resolver este problema!

para tratar o giro, é so adicionar ao seu manifest

Olha, sobre giro é mais complicado, pois o android procura um layout em paisagem, se não encontra ele tenta arrumar o existente. Isso da muita zica.

Saudações bem de acordo com está página : http://developer.android.com/guide/topics/resources/runtime-changes.html

Você deve apenas colocar

na declaração da Activity do AndroidManifest.xml e setar no java da Activity

[code]@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}

}[/code]

Eu realmente tentei fazer assim e no meu caso não deu certo. Talvez tenha uma maneira mais soviética de fazer, mas no meu caso específico só funcionou quando salvei o caminho no final da imagem quando a tela é alterada e seta novamente quando carregada eu fiz assim:

[code] private Bitmap imagem = null;

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
if(imagem != null){
Uri uri = getImageUri(getApplicationContext(), imagem);
File file = new File(getRealPathFromURI(uri));
savedInstanceState.putString(“caminho”, file.getPath());
}

}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String caminho = savedInstanceState.getString("caminho");
    if(caminho != null){
        File imgFile = new  File("caminho");
        Bitmap btm = BitmapFactory.decodeFile(caminho);
        if(btm != null){
            ImageView myImage = (ImageView) findViewById(R.id.imageView1);
            myImage.setImageBitmap(btm);
            imagem = btm;
        }else{
            Log.i(TAG, " erro x");
        }
    }else{
        Log.i(TAG, "erro xx" );
    }
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, “Title”, null);
return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

[/code]
Acho que tem um exemplo melhor aqui: http://developer.android.com/training/basics/activity-lifecycle/recreating.html

Acho que essa pergunta já tem um tempo e que todo mundo já deve saber fazer isso de forma automática, mas postei porque eu tentei de várias formas e não estava funcionando.

Boa sorte e até…