首页 > 解决方案 > 打开选择图像意图时出现 TransactionTooLargeException(Kotlin,Android)

问题描述

我目前正在开发我的应用程序,并且我有一个片段,用户可以在其中选择要插入数据库的图像。这可行,但是当我继续我的编辑片段并尝试再次使用相同的代码来选择图像时,我得到一个TransactionTooLargeException.

错误

2020-12-26 23:23:45.919 3837-3837/com.google.gradient.red E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.google.gradient.red, PID: 3837
    java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 7007624 bytes
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:161)
        at android.os.Handler.handleCallback(Handler.java:888)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8178)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
     Caused by: android.os.TransactionTooLargeException: data parcel size 7007624 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(BinderProxy.java:526)
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4561)
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
        at android.os.Handler.handleCallback(Handler.java:888) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:213) 
        at android.app.ActivityThread.main(ActivityThread.java:8178) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 

我试过的

我看到一些解决方案说将这样的内容放入我的代码中,以触发图像意图,但我仍然遇到同样的错误。我可能做错了什么,但我不确定。

override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.clear()
    }

代码

这是我OnCreateView设置 setOnClickListener 的地方:

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_update, container, false)

        // Set menu
        setHasOptionsMenu(true)

        // Get bitmap
        bitmap = args.currentItem.image

        view.current_title_et.setText(args.currentItem.title)
        view.current_description_et.setText(args.currentItem.description)
        view.current_mood_spinner.setSelection(mSharedViewModel.parseMood(args.currentItem.mood))
        view.current_mood_spinner.onItemSelectedListener = mSharedViewModel.listener

        // Opens gallery when image button clicked, gets image
        view.current_image_et.setOnClickListener {
            readStorageTask()
            //Intent to pick image
            val intent = Intent(Intent.ACTION_PICK)
            intent.type = "image/*"
            startActivityForResult(intent, 1001)
        }

        return view
    }

我正在努力做到这一点,以便用户可以在我的应用程序中编辑图像并且不知道我将如何解决这个错误,所以任何帮助将不胜感激!

标签: androidkotlin

解决方案


我在切换代码以使用 ViewModel 时遇到了同样的问题。它以前工作正常,不确定是否有影响,但这是我修复它的方法。

修复了崩溃,但当然并不理想,因为它为我清除了所有的outStateoutState.clear()也成功了,所以我无法处理图像。

所以我outState.keySet()在循环中使用并打印了每个键。然后outState.remove(key)为每个键输入,并一次注释掉每个键 1,直到找到导致崩溃的那个。对我来说,它是“android:support:fragments”。

我假设这是因为我从片段启动画廊,并且还onActivityResult()从片段调用。所以我唯一需要从 outState 中删除的是outState.remove("android:support:fragments"),这只是意味着我需要从活动中启动画廊意图,并从那里处理它。

它仍然不是一个理想的修复,因为我确信我通过删除外部碎片会导致更多问题,但它现在是一个很好的临时修复,当我有时间进行更多研究时,我会更新,或者也许有人更熟悉 ViewModels 中的生命周期可以找到更好的解决方案。

TL;博士:

添加outState.remove("android:support:fragments")到您的活动并从活动onSavedInstanceState()中启动库和流程onActivityResult()


推荐阅读