TransactionTooLargeException 即使文件大小非常小
TransactionTooLargeException even when file size is super small
我在尝试共享图像文件时不断收到此错误消息:
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 错误仍然被抛出,说包裹大小实际上没有改变一点。更重要的是,当我select通过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)
因此,最终解决此 T运行sactionTooLarge 异常的方法是识别 Activity 将其从属片段、视图等添加到包中的数据包。然后我运行这段代码中说Activity:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Clear the Activity's bundle of the subsidiary fragments' bundles.
outState.clear();
}
这对我来说已经解决了。希望这对外面的人有帮助!
好的,所以这个答案已经很晚了,但肯定会帮助那些在两个 Activity.
之间传递日期时寻找 TransactionTooLargeException 可能解决方案的人
我已经写了一个关于如何将大数据从一个 Activity 传递到另一个 Activity 的答案,该解决方案使用 Shared Preference 来存储 Bundle 并将其传递给另一个 Activity。这是答案How to pass large data between two activities
注意:此解决方案会在读取后清除存储的 Bundle,如果重新创建 Activity,则不会 return Bundle。这是一种解决方法,我们将不胜感激任何建议或问题。
我在尝试共享图像文件时不断收到此错误消息:
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 错误仍然被抛出,说包裹大小实际上没有改变一点。更重要的是,当我select通过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)
因此,最终解决此 T运行sactionTooLarge 异常的方法是识别 Activity 将其从属片段、视图等添加到包中的数据包。然后我运行这段代码中说Activity:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Clear the Activity's bundle of the subsidiary fragments' bundles.
outState.clear();
}
这对我来说已经解决了。希望这对外面的人有帮助!
好的,所以这个答案已经很晚了,但肯定会帮助那些在两个 Activity.
之间传递日期时寻找 TransactionTooLargeException 可能解决方案的人我已经写了一个关于如何将大数据从一个 Activity 传递到另一个 Activity 的答案,该解决方案使用 Shared Preference 来存储 Bundle 并将其传递给另一个 Activity。这是答案How to pass large data between two activities
注意:此解决方案会在读取后清除存储的 Bundle,如果重新创建 Activity,则不会 return Bundle。这是一种解决方法,我们将不胜感激任何建议或问题。