【问题标题】:TransactionTooLargeException even when file size is super smallTransactionTooLargeException 即使文件大小非常小
【发布时间】:2018-01-25 22:49:11
【问题描述】:

我在尝试共享图像文件时不断收到此错误:

java.lang.RuntimeException: android.os.TransactionTooLargeException: 数据包大小 1085992 字节

我认为解决此问题的方法是进一步压缩图像并减小尺寸。这是完成这项工作的函数:

 public static File saveBitmaptoFile(Bitmap bitmap, File pictureFile) {
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(pictureFile);

        // on the next line I'm trying compress the heck out of image.
        bitmap.compress(Bitmap.CompressFormat.JPEG, 1, out);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return pictureFile;
}

分享功能如下:

 private void shareToInstagram() {
        String type = "image/png";
        Intent share = new Intent(Intent.ACTION_SEND);
       //saveBitmpatoFile saves an extremely small and compressed file about 5kb in size

        File pictureFile = ImageUtil.saveBitmaptoFile(photo, ImageUtil.getOutputMediaFile());
        Uri imgUri = FileProvider.getUriForFile(mContext,"com.mycompany.myapp", pictureFile);

        share.setType(type);
        share.putExtra(Intent.EXTRA_STREAM, imgUri);
        mContext.startActivity(Intent.createChooser(share, "Share to"));
    }

我不明白,即使对图片文件进行了如此极端的压缩,TransactionTooLarge 错误仍然会被抛出,说包裹大小实际上没有改变一点。更重要的是,当我选择通过 gmail 共享文件时,我看到文件大小为 5kb;我远低于文档中 1000kb 的缓冲区大小!任何人都知道什么可能导致这个错误仍然被抛出?

错误日志:

E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 1085992)
W/ActivityThread: Bundle stats:
W/ActivityThread:   android:viewHierarchyState [size=3192]
W/ActivityThread:     android:views [size=3088]
W/ActivityThread:   android:support:fragments [size=5516]
W/ActivityThread: PersistableBundle stats:
W/ActivityThread:   [null]
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.myCompany.myApp, PID: 6837
              java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1085992 bytes
                  at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3950)
                  at android.os.Handler.handleCallback(Handler.java:790)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
               Caused by: android.os.TransactionTooLargeException: data parcel size 1085992 bytes
                  at android.os.BinderProxy.transactNative(Native Method)
                  at android.os.BinderProxy.transact(Binder.java:764)
                  at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4623)
                  at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3934)
                  at android.os.Handler.handleCallback(Handler.java:790) 
                  at android.os.Handler.dispatchMessage(Handler.java:99) 
                  at android.os.Looper.loop(Looper.java:164) 
                  at android.app.ActivityThread.main(ActivityThread.java:6494) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
E/UncaughtException: java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1085992 bytes
                     at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3950)
                     at android.os.Handler.handleCallback(Handler.java:790)
                     at android.os.Handler.dispatchMessage(Handler.java:99)
                     at android.os.Looper.loop(Looper.java:164)
                     at android.app.ActivityThread.main(ActivityThread.java:6494)
                     at java.lang.reflect.Method.invoke(Native Method)
                     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                  Caused by: android.os.TransactionTooLargeException: data parcel size 1085992 bytes
                     at android.os.BinderProxy.transactNative(Native Method)
                     at android.os.BinderProxy.transact(Binder.java:764)
                     at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4623)
                     at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3934)
                     at android.os.Handler.handleCallback(Handler.java:790) 
                     at android.os.Handler.dispatchMessage(Handler.java:99) 
                     at android.os.Looper.loop(Looper.java:164) 
                     at android.app.ActivityThread.main(ActivityThread.java:6494) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

【问题讨论】:

  • 发布的代码是否会导致该异常?
  • @greenapps 错误日志显示:在 android.app.ActivityThread$StopInfo.run(ActivityThread.java:3950),在 android.os.Handler.handleCallBack(Handler.java:790),在android.os.Handler.dispatchMessage(Handler.java:99),在 android.os.Looper.loop(Looper.java:164)
  • Does the posted code cause that exception? ?
  • 您的错误可能来自其他原因,例如保存的实例状态Bundle。由于我们没有完整的 Java 堆栈跟踪,也没有您“尝试共享图像文件”的代码,因此我们无法提供帮助。
  • 发布的代码会影响我要分享的图像的大小,但是,我不会说这是导致崩溃的原因。它崩溃了,因为被共享的文件在某种程度上仍然被读取为 1080000 字节大,即使在接收文件的应用程序中,读取的文件只有 5000 字节大。

标签: android android-intent android-sharing


【解决方案1】:

因此,解决此 TransactionTooLarge 异常的最终方法是识别具有其从属片段、视图等的 Activity,将数据包添加到包中。然后我在所说的 Activity 中运行了这段代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //Clear the Activity's bundle of the subsidiary fragments' bundles.
    outState.clear();
}

这为我解决了问题。希望这可以帮助那里的人!

【讨论】:

  • 我尝试了不同的库,但这就像一个魅力。!!!只需多出一行代码。谢谢
  • KarmaDeli,您注意到任何副作用了吗?解决方案确实可以解决这个问题,但让我很困扰的是我不知道它是如何工作的以及会发生什么。你有没有找到关于这个问题的任何相关文件?
  • 是的,有一些文档,link。基本上我理解正在发生的是这段代码看到与活动相关的各个片段将数据存储在它们自己的包中,并且活动的包本身不会通过将其所有片段的包再次保存到自己的包中来加倍 - - 这就是导致事务缓冲区首先超过 1 mb 限制的原因......我记得没有副作用,活动的所有视图都由片段保存。
  • 我在返回活动数据时尝试了这个解决方案......活动为空......
  • 这不是一个修复...这只是一个解决方法,如果您不在捆绑包中保存重要的东西...这个“修复”捆绑包中的清理数据将是保存..
【解决方案2】:

好的,所以这个答案已经很晚了,但肯定会帮助那些在两个 Activity 之间传递日期时为 TransactionTooLargeException 找到可能解决方案的人。

我已经写了一个关于如何将大数据从一个 Activity 传递到另一个 Activity 的答案,该解决方案使用 Shared Preference 来存储 Bundle 并将其传递给另一个 Activity。这是答案How to pass large data between two activities

注意:此方案会在读取后清除存储的Bundle,如果重新创建Activity,则不会返回Bundle。这是一种解决方法,任何建议或问题都将受到高度赞赏。

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 2019-01-01
    • 2016-01-29
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多