使用意向Android发送位图

我有一个位图变量在Activity1名称是bmp ,我想发送到Activity2使用此代码:

 Intent in1 = new Intent(this, Activity2.class); in1.putExtra("image",bmp); startActivity(in1); 

在Activity2中,我这样称呼它:

 Bundle ex = getIntent().getExtras(); Bitmap bmp2 = ex.getParceable("image"); ImageView result = (ImageView)findViewById(R.Id.imageView1); result.setImageBitmap(bmp); 

为什么当我运行程序,它只是运行,不给任何结果? 任何人都可以帮助我?

在将其添加到意图之前将其转换为字节数组,然后将其发送出去并进行解码。

 //Convert to byte array ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); Intent in1 = new Intent(this, Activity2.class); in1.putExtra("image",byteArray); 

然后在活动2中:

 byte[] byteArray = getIntent().getByteArrayExtra("image"); Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 

编辑

以为我应该用最佳实践来更新这个:

在你的第一个活动中,你应该将位图保存到磁盘,然后在下一个活动中加载它。 确保在第一个活动中回收您的位图,以便为垃圾收集做好准备:

活动1:

 try { //Write file String filename = "bitmap.png"; FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); //Cleanup stream.close(); bmp.recycle(); //Pop intent Intent in1 = new Intent(this, Activity2.class); in1.putExtra("image", filename); startActivity(in1); } catch (Exception e) { e.printStackTrace(); } 

在Activity 2中,加载位图:

 Bitmap bmp = null; String filename = getIntent().getStringExtra("image"); try { FileInputStream is = this.openFileInput(filename); bmp = BitmapFactory.decodeStream(is); is.close(); } catch (Exception e) { e.printStackTrace(); } 

干杯!

有时,位图可能太大,无法进行编码和解码,或者在意图中传递为字节数组。 这可能会导致OOM或不良的UI体验。

我建议考虑将位图放入新活动(使用它的那个)的静态变量中,当你不再需要它的时候,它会小心地为null(意思是在onDestroy中,但只有当“isChangingConfigurations”返回false时)。

我们也可以通过意图传递数据来解决这个问题。 只需将图像存储在内存中,然后在下一个Activity中从该位置加载图像,这也可以避免应用程序崩溃传递大量的位图数据。 注意:您甚至不需要将位置路径传递给意图,记住路径并使用它。

我也希望为那些希望这样做的人发布一个最佳实践的答案(但可能会提出错误的问题)。

我推荐使用通用图像加载程序( Image Loader)等图像加载程序将图像下载到ImageView中,而不是传递位图(我假定您从网络上下载过,否则就已经有文件引用了)。 您可以配置它,然后将图像缓存到磁盘:

  DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .considerExifParams(true) .bitmapConfig(Bitmap.Config.RGB_565) .build(); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .defaultDisplayImageOptions(defaultOptions) .build(); ImageLoader.getInstance().init(config); 

现在,只需在您的意图传递图像URL,并使用UIL加载图像。 例如,在新创建的活动中,即使图像URL自下载以来已过期,图像也会立即加载,因为图像是从缓存加载的。

简单地说,我们只能传递位图的Uri而不是传递Bitmap对象。 如果Bitmap对象是Big,则会导致内存问题。

FirstActivity。

 intent.putExtra("uri", Uri); 

从SecondActivity我们回来了位图。

 Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri)); 
 Bundle b = new Bundle(); b.putSerializable("Image", Bitmap); mIntent.putExtras(b); startActivity(mIntent);