Question

My application does this: takes a photo, then show the photo in an ImageView. The weird thing is that the photo is displayed for about a second (after taking it with the camera), and then the ImageView is empty again.

This is my code:

publish.xml

<ImageView
    android:id="@+id/itemImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />

PublishActivity.java

package ar.com.guiagratis;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class PublishActivity extends Activity {
    final int TAKE_PICTURE_REQUEST_CODE = 115;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.publish);        
    }

    public void btnNextClick(View v) {
        // TODO: disable all buttons
        //Intent intent=new Intent(getApplicationContext(), TakePhotoActivity.class);
        // startActivityForResult(intent, TAKE_PICTURE_RESULT_CODE);    

         Toast.makeText(getApplicationContext(), "Sacate una foto viteh", Toast.LENGTH_SHORT).show();

         Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
         File photoFile = new File(Environment.getExternalStorageDirectory(),  "Photo.png");
         Uri imageUri = Uri.fromFile(photoFile);
         intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
         startActivityForResult(intent, TAKE_PICTURE_REQUEST_CODE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {        
        switch (requestCode) {
            case TAKE_PICTURE_REQUEST_CODE:
                if (resultCode == Activity.RESULT_OK) {
                    File photoFile = new File(Environment.getExternalStorageDirectory(),  "Photo.png");
                    Uri imageUri = Uri.fromFile(photoFile);

                    // Image captured and saved to fileUri specified in the Intent
                    Toast.makeText(this, "Image saved to:\n" +
                            imageUri, Toast.LENGTH_LONG).show();

                    Bitmap myBitmap = BitmapFactory.decodeFile(imageUri.getPath());
                    BitmapDrawable ob = new BitmapDrawable(myBitmap);
                    ImageView myImage = (ImageView) findViewById(R.id.itemImage);
                    myImage.setBackgroundDrawable(ob);

                    Toast.makeText(getApplicationContext(), "Qué linda foto! ", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Hubo un problema al subir la imágen... ", Toast.LENGTH_SHORT).show();                  
                }
        }
    }
}

Any help will be appreciated.

Était-ce utile?

La solution 2

Ok, I finally found the problem. I was not aware that I need to use onSaveInstanceState and onRestoreInstanceState to store the values I don't want to loose from an Activity when I'm doing certain things, like initiating the Camera and taking a photo.

So I added this code:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    // Save UI state changes to the savedInstanceState.
    // This bundle will be passed to onCreate if the process is
    // killed and restarted.
    savedInstanceState.putBoolean("photoUploaded", photoUploaded);   
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Restore UI state from the savedInstanceState.
    // This bundle has also been passed to onCreate.
    photoUploaded = savedInstanceState.getBoolean("photoUploaded");

    if (photoUploaded) {
        File photoFile = new File(Environment.getExternalStorageDirectory(),  "Photo.png");
        Uri imageUri = Uri.fromFile(photoFile);

        Bitmap myBitmap = BitmapFactory.decodeFile(imageUri.getPath());
        BitmapDrawable ob = new BitmapDrawable(myBitmap);
        ImageView myImage = (ImageView) findViewById(R.id.uploadedImage);
        myImage.setBackgroundDrawable(ob);
    }   
}

and now is working.

Not sure how to do to make this question as solved.

Autres conseils

You're using setBackgroundDrawable(Drawable drawable) which sets the View's background.

If you want to change the ImageView's content you need to use

setImageDrawable(Drawable drawable)

or

setImageBitmap(Bitmap bm)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top