Duvida Tirar foto e exibir na aplicação

7 respostas
S

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>

7 Respostas

D

voce precisa gravar a foto no sd

S

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

D

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?

F

já tentou criar um layout paisagem?

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

S

fasandes:
já tentou criar um layout paisagem?

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


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!

F

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.

D

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

Você deve apenas colocar

android:configChanges="orientation|keyboardHidden"

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

@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();
    }
}

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:

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);
    }
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é....

Criado 30 de outubro de 2012
Ultima resposta 7 de ago. de 2015
Respostas 7
Participantes 4