Activity之间传递数据之Bitmap

本文介绍了在Android中如何处理Activity之间传递大尺寸Bitmap导致的问题。在480X800分辨率设备上正常运行,但在720X1280分辨率设备上出现死机情况。解决方法是将Bitmap转换为Byte数组进行传递,或者保存为临时文件并传递文件路径。提供了解决问题的代码示例和QQ交流群信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做项目时涉及到Activity之间传Bitmap,查看Bitmap实现了Parcelable,所以就把Bitmap放到bundle里,在480X800分辨率的手机测试正常,换到红米720X1280分辨率的手机就死机了,Debug发现就是传递Bitmap引起的,在网上查了相关的资料说不能直接传递40K的图片,于是把Bitmap转成Byte传递就正常了,当然也可以把Bitmap保存为临时图片,再传递文件路径。


传Byte的代码如下:

Intent intent=new Intent(this,TwoActivity.class);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte [] bitmapByte =baos.toByteArray();
intent.putExtra("bitmap", bitmapByte);
startActivity(inten
### 在 Android 中使用 Kotlin 实现 Activity传递 Bitmap 图片 为了在两个 `Activity` 之间安全有效地传递 `Bitmap` 数据,在考虑性能和内存管理的情况下,可以采用以下方法: #### 方法一:压缩并转换为字节数组再传递 这种方式适用于较小尺寸的图像。首先将 `Bitmap` 压缩成字节流形式并通过 `Intent` 的额外参数发送给目标 `Activity`。 ```kotlin // 发送方 Activity (SourceActivity.kt) val bitmap = ... // 获取到要传递Bitmap 对象 val stream = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream) val byteArray = stream.toByteArray() val intent = Intent(this@SourceActivity, TargetActivity::class.java).apply { putExtra("image_bitmap", byteArray) } startActivity(intent) // 接收方 Activity (TargetActivity.kt) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_target) val byteArray = intent.getByteArrayExtra("image_bitmap") ?: return val bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size) findViewById<ImageView>(R.id.imageView).setImageBitmap(bitmap) } ``` 这种方法简单直接,但对于较大的图片可能会遇到 Binder Transaction 失败的问题[^3]。 #### 方法二:利用缓存机制或文件存储来间接共享大图 对于较大尺寸的图片建议先将其保存至应用内部缓存目录或者外部储存空间中,之后仅需传送对应的 URI 或者路径字符串即可让接收端读取该位置上的实际内容。 ```kotlin // 发送方 Activity (SourceActivity.kt) fun saveToCacheAndSend(imageView: ImageView) { val cachePath = File(cacheDir, "temp_image.png") try { val fos = FileOutputStream(cachePath) imageView.drawable.toBitmap().compress(Bitmap.CompressFormat.PNG, 90, fos) fos.flush() fos.close() val uri = Uri.fromFile(cachePath) val intent = Intent(this, TargetActivity::class.java).apply { data = uri } startActivity(intent) } catch(e : IOException){ e.printStackTrace() } } // 接收方 Activity (TargetActivity.kt) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_target) val imageUri = intent.data if (imageUri != null && "file".equals(imageUri.scheme)) { val fileStream = contentResolver.openInputStream(imageUri) val bitmap = BitmapFactory.decodeStream(fileStream) findViewById<ImageView>(R.id.imageView).setImageBitmap(bitmap) } // 清理临时文件 deleteTempFiles() } private fun deleteTempFiles() { val tempFile = File(cacheDir, "temp_image.png") if(tempFile.exists()){ tempFile.delete() } } ``` 此方案解决了因数据量过大而导致传输失败的风险,并且提高了应用程序处理大型多媒体资源的能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值