你如何通过使用捆绑的android活动之间传递图像(位图)?
假设我有一个活动来从图库中选择一个图像,并将其作为一个BitMap进行检索,就像这个例子: 在这里
现在,我想传递这个BitMap在ImageView中用于另一个活动。 我知道捆绑可以在活动之间传递,但是如何将这个BitMap存储到捆绑中?
或者我应该采取另一种方法?
我会强烈推荐一个不同的方法。
如果你真的想要这样做,但是这样会花费很多的内存,而且速度也很慢。 如果你有一个旧的手机和一个大的位图,它可能无法正常工作。 你可以把它作为一个额外的,例如intent.putExtra("data", bitmap)
。 一个位图实现了Parcelable,所以你可以把它放在一个额外的。 同样,一个包已经putParcelable
。
如果你想在它的活动之间传递它,我会把它存储在一个文件中。 这样更有效率,而且对你的工作更少。 您可以使用MODE_PRIVATE在您的数据文件夹中创建任何其他应用程序无法访问的私有文件。
如果你把它作为Parcelable传递,你一定会得到一个JAVA BINDER FAILURE错误。 所以,解决方案是这样的:如果位图很小,就像缩略图一样,将它作为字节数组传递,并在下一个活动中构建位图以供显示。 例如:
在你的通话活动中
Intent i = new Intent(this, NextActivity.class); Bitmap b; // your bitmap ByteArrayOutputStream bs = new ByteArrayOutputStream(); b.compress(Bitmap.CompressFormat.PNG, 50, bs); i.putExtra("byteArray", bs.toByteArray()); startActivity(i);
…和您的接收活动
if(getIntent().hasExtra("byteArray")) { ImageView previewThumbnail = new ImageView(this); Bitmap b = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length); previewThumbnail.setImageBitmap(b); }
正如@EboMike所建议的那样,我将位图保存在我的应用程序的内部存储中名为myImage的文件中,而不是其他应用程序可访问的。 这是该部分的代码:
public String createImageFromBitmap(Bitmap bitmap) { String fileName = "myImage";//no .png or .jpg needed try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes); FileOutputStream fo = openFileOutput(fileName, Context.MODE_PRIVATE); fo.write(bytes.toByteArray()); // remember close file output fo.close(); } catch (Exception e) { e.printStackTrace(); fileName = null; } return fileName; }
然后在下一个活动中,您可以使用以下代码将此文件myImage解码为位图:
Bitmap bitmap = BitmapFactory.decodeStream(context .openFileInput("myImage"));//here context can be anything like getActivity() for fragment, this or MainActivity.this
注意很多检查null和缩放位图的操作都被忽略。
位图是Parcelable,所以你可以使用[putExtra(String,Parcelable)] [2]方法添加,但不确定这是一个最佳实践,如果它是大尺寸数据,最好存储在一个地方,并使用两个活动。
[2]: http : //developer.android.com/reference/android/content/Intent.html#putExtra (java.lang.String,android.os.Parcelable)
活动
在Activites之间传递一个位图
Intent intent = new Intent(this, Activity.class); intent.putExtra("bitmap", bitmap);
并在Activity类中
Bitmap bitmap = getIntent().getParcelableExtra("bitmap");
分段
在碎片之间传递一个位图
SecondFragment fragment = new SecondFragment(); Bundle bundle = new Bundle(); bundle.putParcelable("bitmap", bitmap); fragment.setArguments(bundle);
在SecondFragment里面接收
Bitmap bitmap = getArguments().getParcelable("bitmap");
传输大位图(压缩位图)
如果您的绑定事务处理失败,则意味着您将大元素从一个活动转移到另一个活动,从而超出了绑定事务缓冲区。
所以在这种情况下,您必须将位图压缩为一个字节的数组,然后在另一个活动中解压缩 ,如下所示
在FirstActivity
Intent intent = new Intent(this, SecondActivity.class); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream); byte[] bytes = stream.toByteArray(); intent.putExtra("bitmapbytes",bytes);
而在第二活动
byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes"); Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
在first.java
Intent i = new Intent(this, second.class); i.putExtra("uri",uri); startActivity(i);
在second.java
Bundle bd = getIntent().getExtras(); Uri uri = bd.getParcelable("uri"); Log.e("URI", uri.toString()); try { Bitmap bitmap = Media.getBitmap(this.getContentResolver(), uri); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
我不得不重新调整位图一点,不超过交易活页夹的1mb限制。 你可以调整你的屏幕或者使它变成动态的,这仅仅是一个例子。 它工作正常,质量很好。 它也快很多,然后保存图像和加载后,但你有大小的限制。
public void loadNextActivity(){ Intent confirmBMP = new Intent(this,ConfirmBMPActivity.class); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap bmp = returnScaledBMP(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream); confirmBMP.putExtra("Bitmap",bmp); startActivity(confirmBMP); finish(); } public Bitmap returnScaledBMP(){ Bitmap bmp=null; bmp = tempBitmap; bmp = createScaledBitmapKeepingAspectRatio(bmp,400); return bmp;
}
在使用以下代码恢复nextActivity中的bmp之后:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_confirmBMP); Intent intent = getIntent(); Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Bitmap"); }
我希望我的回答有所帮助。 问候