即使文件大小超小,TransactionTooLargeException也是如此

Kar*_*eli 0 android android-intent android-sharing

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

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;
}
Run Code Online (Sandbox Code Playgroud)

这是共享功能:

 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"));
    }
Run Code Online (Sandbox Code Playgroud)

我不明白,即使将这种极端压缩应用于图片文件,仍然会抛出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) 
Run Code Online (Sandbox Code Playgroud)

Kar*_*eli 17

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

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

这为我解决了这个问题.希望这能帮到那里的人!

  • 这不是修复...这只是一种解决方法,如果您不将重要的内容保存在捆绑包中,则该方法有效...此“修复”清理了将被保存的捆绑包内的所有数据。 (3认同)
  • KarmaDeli,您注意到任何副作用吗?解决方案确实可以解决该问题,但令我困扰的是我不知道它是如何工作的以及会发生什么。您是否找到过有关此事的任何相关文件? (2认同)