Java/Android - 创建位图 - OOM 错误
Java/Android - creating Bitmap - OOM error
Edit2:我将 android:largeHeap="true" 添加到清单中,现在它似乎工作正常。但我现在不会关闭它,因为我不确定它是否是正确的方法,我会做更多的测试。
我正在开发一个带有集成摄像头的应用程序(camera1,该应用程序需要在 Android 4.4.2 上运行),该应用程序能够以横向模式拍摄照片,现在我想添加在人像模式下拍摄风景照片的可能性。
所以我基本上是拍摄人像模式照片,旋转并裁剪它(切掉顶部和底部,所以它有 4:3 比例)。
此代码在 Android 6.0.1(Samsung Galaxy Tab S2)(目前正在测试但已经有 30 个)上有效,但我在 4.4.2(Motorola Symbol TC70)上遇到 OOM 错误。拍摄第三张照片后出现错误。
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:809)
at android.graphics.Bitmap.createBitmap(Bitmap.java:786)
at android.graphics.Bitmap.createBitmap(Bitmap.java:718)
at de.sdnord.ballistiks.topspeedgt.main.detail_fragment.fotos.CameraActivity.onPictureTaken(CameraActivity.java:66)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:940)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5050)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:780)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:596)
at dalvik.system.NativeStart.main(Native Method)
我添加了这段代码:
if (PreferenceManager.getDefaultSharedPreferences(CameraActivity.this).getString(Constants.FOTO_ORIENTATION, Constants.FOTO_ORIENTATION_LANDSCAPE).equals(Constants.FOTO_ORIENTATION_PORTRAIT)) {
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmap = Bitmap.createBitmap(bitmap, bitmap.getWidth()/2 - bitmap.getHeight()*heightMultiplier/widthMultiplier/2, 0, bitmap.getHeight()*heightMultiplier/widthMultiplier, bitmap.getHeight(), matrix, false);
ByteArrayOutputStream streamsy = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, streamsy);
data = streamsy.toByteArray();
bitmap.recycle();
try {
streamsy.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这是第 66 行:
bitmap = Bitmap.createBitmap(bitmap, bitmap.getWidth()/2 - bitmap.getHeight()*heightMultiplier/widthMultiplier/2, 0, bitmap.getHeight()*heightMultiplier/widthMultiplier, bitmap.getHeight(), matrix, false);
我有点无能,希望有人能提供帮助,有想法或提示。
敬畏
编辑:
我正在裁剪它,因为我只想要屏幕的中间部分。
Camera Screenshot
Edit2:我将 android:largeHeap="true" 添加到清单中,现在它似乎工作正常。但我现在不会关闭它,因为我不确定它是否是正确的方法,我会做更多的测试。
我在清单中添加了 android:largeHeap="true",现在可以正常工作了。
敬畏
Edit2:我将 android:largeHeap="true" 添加到清单中,现在它似乎工作正常。但我现在不会关闭它,因为我不确定它是否是正确的方法,我会做更多的测试。
我正在开发一个带有集成摄像头的应用程序(camera1,该应用程序需要在 Android 4.4.2 上运行),该应用程序能够以横向模式拍摄照片,现在我想添加在人像模式下拍摄风景照片的可能性。
所以我基本上是拍摄人像模式照片,旋转并裁剪它(切掉顶部和底部,所以它有 4:3 比例)。
此代码在 Android 6.0.1(Samsung Galaxy Tab S2)(目前正在测试但已经有 30 个)上有效,但我在 4.4.2(Motorola Symbol TC70)上遇到 OOM 错误。拍摄第三张照片后出现错误。
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:809)
at android.graphics.Bitmap.createBitmap(Bitmap.java:786)
at android.graphics.Bitmap.createBitmap(Bitmap.java:718)
at de.sdnord.ballistiks.topspeedgt.main.detail_fragment.fotos.CameraActivity.onPictureTaken(CameraActivity.java:66)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:940)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5050)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:780)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:596)
at dalvik.system.NativeStart.main(Native Method)
我添加了这段代码:
if (PreferenceManager.getDefaultSharedPreferences(CameraActivity.this).getString(Constants.FOTO_ORIENTATION, Constants.FOTO_ORIENTATION_LANDSCAPE).equals(Constants.FOTO_ORIENTATION_PORTRAIT)) {
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmap = Bitmap.createBitmap(bitmap, bitmap.getWidth()/2 - bitmap.getHeight()*heightMultiplier/widthMultiplier/2, 0, bitmap.getHeight()*heightMultiplier/widthMultiplier, bitmap.getHeight(), matrix, false);
ByteArrayOutputStream streamsy = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, streamsy);
data = streamsy.toByteArray();
bitmap.recycle();
try {
streamsy.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这是第 66 行:
bitmap = Bitmap.createBitmap(bitmap, bitmap.getWidth()/2 - bitmap.getHeight()*heightMultiplier/widthMultiplier/2, 0, bitmap.getHeight()*heightMultiplier/widthMultiplier, bitmap.getHeight(), matrix, false);
我有点无能,希望有人能提供帮助,有想法或提示。
敬畏
编辑: 我正在裁剪它,因为我只想要屏幕的中间部分。 Camera Screenshot
Edit2:我将 android:largeHeap="true" 添加到清单中,现在它似乎工作正常。但我现在不会关闭它,因为我不确定它是否是正确的方法,我会做更多的测试。
我在清单中添加了 android:largeHeap="true",现在可以正常工作了。
敬畏