如何将位图从一个活动传递到另一个活动?

时间:2014-05-14 09:27:04

标签: android android-intent bitmap camera

我有两个活动,第一个活动(相机活动)包含两个用于打开相机的按钮,第二个活动显示表单包含我需要传递在另一个FORM活动中从相机捕获的位图的图像视图 ,相机打开并拍摄图像,此图像放在另一个活动的imageview上 但我的代码是拍摄图像并返回第一个活动不显示在第二个活动上?

相机代码

public class camera extends Activity {
static final int REQUEST_IMAGE_CAPTURE = 1;
private static final int CAMERA_REQUEST = 1888;
ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);


    //register
   Button camera = (Button)findViewById(R.id.s_camera);
    camera.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            open();
        }
    });

    Button call = (Button)findViewById(R.id.s_call);
    call.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Uri uri = Uri.parse("tel:0555064740");
            Intent intent = new Intent(Intent.ACTION_VIEW,uri);
            startActivity(intent);
        }
    });



}

public void open(){


   Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent,0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==CAMERA_REQUEST&&resultCode==RESULT_OK) {
        Bitmap bp = (Bitmap) data.getExtras().get("data");
        Intent intent = new Intent(getApplicationContext(), formActivity.class);
        intent.putExtra("BitmapImage", bp);

    }


    }

formActivity

public class formActivity  extends Activity {
private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
Bitmap photo;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_form);
    getData();



}
private void getData(){

    Bitmap bitImage=getIntent().getParcelableExtra("BitmapImage");
    imageView.setImageBitmap(bitImage);

}

任何人都可以帮助我???

3 个答案:

答案 0 :(得分:1)

Bitmap实现Parcelable,因此您始终可以在意图中传递它:

Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("BitmapImage", bitmap);

并在另一端检索它:

Intent intent = getIntent();
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage");

您在blackbelt评论的第一个活动中错过了startActivity(intent)。在onActivityResult()

中更新

参考 https://stackoverflow.com/a/2459624/1665507

您可以在下面的链接中找到一个有效的例子,

http://androidmaterial.blogspot.in/2012/07/how-to-pass-bitmap-between-activities.html

修改

正如其他人评论的那样,不建议将大图像发送为Parcelable。您也可以使用以下方法

Bitamp作为扩展数据传递

    ByteArrayOutputStream bStream = new ByteArrayOutputStream();
 //Compress it before sending it to minimize the size and quality of bitmap.
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bStream);
        byte[] byteArray = bStream.toByteArray();

        Intent anotherIntent = new Intent(this, anotherActivity.class);
        anotherIntent.putExtra("image", byteArray);
        startActivity(anotherIntent);
        finish();

在其他活动中检索Bitmap

 if(getIntent().hasExtra("image")) 
   {
    ImageView previewThumbnail = new ImageView(this);
    Bitmap b = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("image"),0,getIntent().getByteArrayExtra("byteArray").length);        
    previewThumbnail.setImageBitmap(b);
    }

参考 https://stackoverflow.com/a/12908133/1665507

还有另一种方式。虽然您正在从相机或图库中拍摄照片,但您始终可以获得图像的确切URI路径,并可以将该路径传递到其他活动。 发送大图像需要大量内存,以便根据需要选择最佳方式。

答案 1 :(得分:1)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==CAMERA_REQUEST&&resultCode==RESULT_OK) {
        Bitmap bp = (Bitmap) data.getExtras().get("data");
        Intent intent = new Intent(getApplicationContext(), formActivity.class);
        intent.putExtra("BitmapImage", bp);

    }
 }
您想念startActivity(intent)的代码段中的

。另一方面,在formActivity.classimageView.setImageBitmap(bitImage);之前,您必须初始化imageView,否则您的应用会崩溃。如评论框中所述,最好提供图片的URI,而不是将整个位图传递给formActivity

答案 2 :(得分:0)

由于问题已经很久了,所以这里的解决方案可以更好地工作,而不会造成任何压缩或质量损失,而且不必创建临时位图文件

  1. 创建一个BitmapHelper类

    request(1)

    }

  2. 现在可以从任何这样的活动中获取或设置位图

    request(50)