如何将 Bitmap 对象从一个活动传递到另一个活动
在我的活动中,我创建了一个 Bitmap 对象,然后我需要启动另一个 Activity, 如何从子活动(即将启动的活动)传递此 Bitmap 对象?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在我的活动中,我创建了一个 Bitmap 对象,然后我需要启动另一个 Activity, 如何从子活动(即将启动的活动)传递此 Bitmap 对象?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(10)
上述所有解决方案都不适合我,将位图作为
parceableByteArray
发送也会生成错误android.os.TransactionTooLargeException:数据包大小
。解决方案
putExtra(String)
发送为All of the above solutions doesn't work for me, Sending bitmap as
parceableByteArray
also generates errorandroid.os.TransactionTooLargeException: data parcel size
.Solution
putExtra(String)
as您可以创建位图传输。试试这个....
在第一类中:
1)创建:
2)创建getter和setter
3)设置图像:
然后,在第二类中:
You can create a bitmap transfer. try this....
In the first class:
1) Create:
2) Create getter and setter
3) Set the image:
Then, in the second class:
就我而言,上述方法对我不起作用。每次我将位图放入意图时,第二个活动都没有开始。当我将位图作为 byte[] 传递时,也会发生同样的情况。
我按照这个链接并且它起作用了就像一个魅力并且非常快:
在我的第一个活动中:
这是我的第二个活动的 onCreate() :
In my case, the way mentioned above didn't worked for me. Every time I put the bitmap in the intent, the 2nd activity didn't start. The same happened when I passed the bitmap as byte[].
I followed this link and it worked like a charme and very fast:
in my 1st acitiviy:
and here is the onCreate() of my 2nd Activity:
Bitmap
实现了Parcelable
,因此您始终可以使用 Intent: 传递它,并在另一端检索它:
Bitmap
implementsParcelable
, so you could always pass it with the intent:and retrieve it on the other end:
实际上,将位图作为 Parcelable 传递将导致“JAVA BINDER FAILURE”错误。尝试将位图作为字节数组传递并构建它以在下一个活动中显示。
我在这里分享了我的解决方案:
如何传递图像(位图)在使用捆绑包的 Android 活动之间?
Actually, passing a bitmap as a Parcelable will result in a "JAVA BINDER FAILURE" error. Try passing the bitmap as a byte array and building it for display in the next activity.
I shared my solution here:
how do you pass images (bitmaps) between android activities using bundles?
由于 Parceable(1mb) 的大小限制,在 Activity 之间将位图作为包中的 parceable 传递并不是一个好主意。您可以将位图存储在内部存储的文件中,并在多个活动中检索存储的位图。这是一些示例代码。
要将位图存储在内部存储中的文件 myImage 中:
然后在下一个活动中,您可以使用以下代码将此文件 myImage 解码为位图:
注意 大量检查 null并且省略了缩放位图。
Passsing bitmap as parceable in bundle between activity is not a good idea because of size limitation of Parceable(1mb). You can store the bitmap in a file in internal storage and retrieve the stored bitmap in several activities. Here's some sample code.
To store bitmap in a file myImage in internal storage:
Then in the next activity you can decode this file myImage to a bitmap using following code:
Note A lot of checking for null and scaling bitmap's is ommited.
如果图像太大并且无法将其保存和加载到存储中,则应该考虑仅使用位图的全局静态引用(在接收活动内),只有在“时”,该位图才会在 onDestory 上重置为 null isChangingConfigurations”返回 true。
If the image is too large and you can't save&load it to the storage, you should consider just using a global static reference to the bitmap (inside the receiving activity), which will be reset to null on onDestory, only if "isChangingConfigurations" returns true.
压缩并发送
位图
当
位图
太大时,接受的答案将会崩溃。我相信这是1MB限制。Bitmap
必须压缩为不同的文件格式,例如由ByteArray
表示的 JPG,然后才能通过安全地传递>意图
。起来
该函数包含在使用 Kotlin Coroutines 的单独线程中,因为在从 url
创建
。Bitmap
之后,Bitmap
压缩被链接 字符串位图
创建需要单独的线程,以避免应用程序无响应 (ANR) 错误。Kotlin 协程使用的概念
toBitmap()
是一个Kotlin 扩展函数 要求将该库添加到应用程序依赖项中。代码
1. 创建
Bitmap
后将其压缩为JPGByteArray
。Repository.kt
ViewModel.kt
2. 通过
Intent
将图像作为ByteArray
传递。在此示例中,它从Fragment 传递到Service。如果在两个活动之间共享,则这是相同的概念。
Fragment.kt
3. 将
ByteArray
转换回Bitmap
。Utils.kt
Compress and Send
Bitmap
The accepted answer will crash when the
Bitmap
is too large. I believe it's a 1MB limit. TheBitmap
must be compressed into a different file format such as a JPG represented by aByteArray
, then it can be safely passed via anIntent
.Implementation
The function is contained in a separate thread using Kotlin Coroutines because the
Bitmap
compression is chained after theBitmap
is created from an urlString
. TheBitmap
creation requires a separate thread in order to avoid Application Not Responding (ANR) errors.Concepts Used
toBitmap()
is a Kotlin extension function requiring that library to be added to the app dependencies.Code
1. Compress
Bitmap
to JPGByteArray
after it has been created.Repository.kt
ViewModel.kt
2. Pass image as
ByteArray
via anIntent
.In this sample it's passed from a Fragment to a Service. It's the same concept if being shared between two Activities.
Fragment.kt
3. Convert
ByteArray
back toBitmap
.Utils.kt
因为Intent有大小限制。
我使用公共静态对象将位图从服务传递到广播....
传递我的服务
My BroadcastReceiver
Because Intent has size limit .
I use public static object to do pass bitmap from service to broadcast ....
pass in my service
My BroadcastReceiver
可能会晚一些,但可以提供帮助。
在第一个片段或活动上声明一个类...例如
然后在第二个类/片段上执行此操作..
希望它有帮助。
It might be late but can help.
On the first fragment or activity do declare a class...for example
Then on the second class/fragment do this..
Hope it helps.