在 Android 中使用 Intent 在活动中传递 android 位图数据
Posted
技术标签:
【中文标题】在 Android 中使用 Intent 在活动中传递 android 位图数据【英文标题】:Passing android Bitmap Data within activity using Intent in Android 【发布时间】:2012-06-16 03:29:36 【问题描述】:我在 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);
应用程序无异常运行,但未给出预期结果
【问题讨论】:
这不是您的代码的副本,因为我看到至少有两个错字。 @Christine :这确实是我的代码,呵呵,但是我从很多教程中得到它... XP 那你怎么创建一个Bitmap bmp2,然后用setImageBitmap(bmp)设置呢?当然,R.Id.imageView1 不起作用。应该是 R.id.imageView1。 您当然可以将位图写入文件,然后在第二个活动中读取该文件。如果设备旋转,您可以使用相同的文件来确保图像仍然存在。 在发布问题之前,请确保您了解您发布的代码,从 *** 复制粘贴来修复错误是没有用的。@Christine - 我正要评论同样的事情错别字.. 【参考方案1】:在将其添加到 Intent、发送和解码之前将其转换为 Byte 数组。
//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);
编辑
认为我应该用最佳实践来更新它:
在您的第一个活动中,您应该将位图保存到磁盘,然后在下一个活动中加载它。确保在第一个活动中回收您的位图,以便为垃圾收集做好准备:
活动一:
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();
在活动 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();
干杯!
【讨论】:
这解决了我遇到的一个问题。由于“transactionTooLargeException”引发了异常。发送额外的完整位图时。 只是想知道如何在片段中使用 getIntent()?我读过这是不可能的,但必须有办法。 getActivity().getIntent() bytearray = 内存中的 3 个图像(bmp 第一个,bytearray,bmp 第二个)文件 = 内存中的 2 个图像(bmp 第一个,文件,bmp 第三个) 我强烈建议避免使用字节数组,因为您可能会达到 2MB 的限制并发生泄漏。我建议创建一个临时文件并通过活动处理其路径【参考方案2】:有时,位图可能太大而无法进行编码和解码,或者在意图中作为字节数组传递。这可能会导致 OOM 或糟糕的 UI 体验。
我建议考虑将位图放入新活动(使用它的活动)的静态变量中,当您不再需要它时,该变量将小心为空(在 onDestroy 中,但仅当“isChangingConfigurations”返回 false 时)。
【讨论】:
【参考方案3】:我们可以只传递 Bitmap 的 Uri 而不是传递 Bitmap 对象。如果 Bitmap 对象很大,则会导致内存问题。
第一个活动。
intent.putExtra("uri", Uri);
从 SecondActivity 我们得到位图。
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri));
【讨论】:
IOexception 当我在 uri 中传递图像路径时。可能的原因是什么。【参考方案4】:通过 Intent 将 Bitmap 发送到另一个 Activity 的 Kotlin 代码:
1- 在第一个活动中:
val i = Intent(this@Act1, Act2::class.java)
var bStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 50, bStream)
val byteArray = bStream.toByteArray()
i.putExtra("image", byteArray )
startActivity(i)
2- 在活动二中(读取位图图像):
var bitmap : Bitmap? =null
if (intent.hasExtra("image"))
//convert to bitmap
val byteArray = intent.getByteArrayExtra("image")
bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
3- 如果您需要将其设置为视图的背景,例如 ConstraintLayout 或...:
if (bitmap != null)
//Convert bitmap to BitmapDrawable
var bitmapDrawable = BitmapDrawable( resources , bitmap)
root_constraintLayout.backgroundDrawable = bitmapDrawable
【讨论】:
Google 刚刚宣布,由于缺乏用户适应能力,他们将停止 Kotlin 开发【参考方案5】:我们也可以在不通过意图传递数据的情况下解决这个问题。只需将图像存储在内存中,在下一个 Activity 中只需从该位置加载图像,这也可以避免应用程序因传递大量位图数据而崩溃。 注意:您甚至不需要将位置路径传递给意图,记住路径并使用它。
【讨论】:
【参考方案6】:我还想为那些希望这样做的人发布一个最佳实践答案(但可能会问错问题)。
我建议使用图像加载器(例如Universal 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 自下载后已过期。
【讨论】:
【参考方案7】:Bundle b = new Bundle();
b.putSerializable("Image", Bitmap);
mIntent.putExtras(b);
startActivity(mIntent);
【讨论】:
位图不可序列化! 请查看此链接:***.com/questions/5871482/…以上是关于在 Android 中使用 Intent 在活动中传递 android 位图数据的主要内容,如果未能解决你的问题,请参考以下文章