Android java.lang.OutOfMemoryError处理来自摄像头的14个数据时出错
我正在制作一个审计应用程序,我必须从单选按钮和14个检查点的图像中收集是/否 该应用程序在我的设备上运行良好,该设备有Android 10设备,但在以任意方式收集4-6幅图像并在各自的Imageview和collect Byte[]字符串变量中显示后,在一些设备上(如牛轧糖设备)进行测试时,该应用程序崩溃,日志中也没有错误(现在通过调试器发现,请参见下文)。请看一下摄像机的编码。应用程序在返回活动时单击照片后崩溃Android java.lang.OutOfMemoryError处理来自摄像头的14个数据时出错,android,crash,android-camera,android-camera-intent,Android,Crash,Android Camera,Android Camera Intent,我正在制作一个审计应用程序,我必须从单选按钮和14个检查点的图像中收集是/否 该应用程序在我的设备上运行良好,该设备有Android 10设备,但在以任意方式收集4-6幅图像并在各自的Imageview和collect Byte[]字符串变量中显示后,在一些设备上(如牛轧糖设备)进行测试时,该应用程序崩溃,日志中也没有错误(现在通过调试器发现,请参见下文)。请看一下摄像机的编码。应用程序在返回活动时单击照片后崩溃 public void ClickImageFromCamera(String
public void ClickImageFromCamera(String code) {
Intent CamIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File destination = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
String img_Decodable_Str = String.valueOf(destination);
Log.e("img fromCam", String.valueOf(destination));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(getActivity(), getActivity().getApplicationContext().getPackageName() + ".provider", destination);
CamIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
} else {
uri = Uri.fromFile(destination);
CamIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
}
CamIntent.putExtra("return-data", true);
startActivityForResult(CamIntent, Integer.parseInt(code));
}
在调试器中发现错误
FATAL EXCEPTION: main
Process: com.field_officer, PID: 15547
java.lang.OutOfMemoryError: Failed to allocate a 14745612 byte allocation with 4194304 free bytes and 8MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:681)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:657)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:701)
at com.field_officer.Fragment.ICICI_report_Static_Fragment.previewCapturedImage(ICICI_report_Static_Fragment.java:794)
at com.field_officer.Fragment.ICICI_report_Static_Fragment.onActivityResult(ICICI_report_Static_Fragment.java:1506)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)
at com.field_officer.HomeActivity.onActivityResult(HomeActivity.java:740)
at android.app.Activity.dispatchActivityResult(Activity.java:6950)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4176)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4223)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1585)
at android.os.Handler.dispatchMessage(Handler.java:110)
好的,我解决了
int nh = (int) (bitmap.getHeight() * (512.0 / bitmap.getWidth()));
Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 512, nh, true);
scaled.compress(Bitmap.CompressFormat.JPEG, 80, byteArrayOutputStream);
byte[] imageBytes = byteArrayOutputStream.toByteArray();
Log.e("Original dimensions", bitmap.getWidth() + " " + bitmap.getHeight());
Log.e("Compressed dimensions", scaled.getWidth() + " " + scaled.getHeight());
Log.e("bytes", String.valueOf(bytes));
bitmap =null;
if(code ==50) {
imageCode1 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode1);
set_img_fascia.setImageBitmap(scaled);
}
if(code ==51) {
imageCode2 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode2);
set_img_lollypop.setImageBitmap(scaled);
...So on
“应用程序崩溃,日志中也没有错误。”你确定吗?“应用程序在返回活动时单击照片后崩溃。”然后您可以调试
onActivityResult()
方法一步一步地查看崩溃的确切原因以及变量值,例如,是什么null
。Ok在调试器java.lang.OutOfMemoryError中发现错误:未能分配14745612字节分配,4194304个空闲字节和8MB,直到OOM听起来像编辑大位图时的问题。Android文档可能会提供一些相关提示。相机意图在某些设备中崩溃
如果是意图,那么您应该只发布该代码。但似乎只有在onActivityResult被调用并执行所有类型的代码之后。请用真实问题更新你的主题。你在onActivityResult中有太多的可能性。一个就够了。请删除所有其他。为什么previewCapturedImage是previewCapturedImage2?只发布导致问题的一个。举一个简单的例子。
public void previewCapturedImage1(int code) {
try {
//encode base64 string to image
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.img);
// bimatp factory
BitmapFactory.Options options = new BitmapFactory.Options();
// downsizing image as it throws OutOfMemory Exception for larger
options.inSampleSize = 8;
bitmap = BitmapFactory.decodeFile(uri.getPath(),
options);
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOutputStream);
byte[] imageBytes = byteArrayOutputStream.toByteArray();
// byte[] imageBytes = byteArrayOutputStream.toByteArray();
//imageCode = Base64.encodeToString(imageBytes, Base64.DEFAULT);
// Log.e("image_code", imageCode);
if(code ==50) {
imageCode1 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode1);
set_img_fascia.setImageBitmap(bitmap);
}
if(code ==51) {
imageCode2 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode2);
set_img_lollypop.setImageBitmap(bitmap);
}
if(code ==52) {
imageCode3 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode3);
set_img_ATM_Count.setImageBitmap(bitmap);
}
if(code ==53) {
imageCode4 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode4);
set_img_ATM_Cooling.setImageBitmap(bitmap);
}
if(code ==54) {
imageCode5 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode5);
set_img_ATM_Backroom_Locked.setImageBitmap(bitmap);
}
if(code ==55) {
imageCode6 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode6);
set_img_ups_room.setImageBitmap(bitmap);
}
if(code ==56) {
imageCode7 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode7);
set_img_Branch_Shutter_Damaged.setImageBitmap(bitmap);
}
if(code ==57) {
imageCode8 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode8);
set_img_Branch_Round_Taken.setImageBitmap(bitmap);
}
if(code ==58) {
imageCode9 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode9);
set_img_AC_ODU_Copper_Intact.setImageBitmap(bitmap);
}
if(code ==59) {
imageCode10 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode10);
set_img_Any_Water_Logging_Vincinity.setImageBitmap(bitmap);
}
if(code ==60) {
imageCode11 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode11);
set_img_FE_Room_Available.setImageBitmap(bitmap);
}
if(code ==61) {
imageCode12 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode12);
set_img_DG_Door_Locked.setImageBitmap(bitmap);
}
if(code ==62) {
imageCode13 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode13);
set_img_Other_Obsevation.setImageBitmap(bitmap);
}
if(code ==63) {
imageCode14 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode14);
set_img_Damage_ATM_lobby.setImageBitmap(bitmap);
}
} catch (NullPointerException e) {
e.printStackTrace();
}
}
FATAL EXCEPTION: main
Process: com.field_officer, PID: 15547
java.lang.OutOfMemoryError: Failed to allocate a 14745612 byte allocation with 4194304 free bytes and 8MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:681)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:657)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:701)
at com.field_officer.Fragment.ICICI_report_Static_Fragment.previewCapturedImage(ICICI_report_Static_Fragment.java:794)
at com.field_officer.Fragment.ICICI_report_Static_Fragment.onActivityResult(ICICI_report_Static_Fragment.java:1506)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)
at com.field_officer.HomeActivity.onActivityResult(HomeActivity.java:740)
at android.app.Activity.dispatchActivityResult(Activity.java:6950)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4176)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4223)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1585)
at android.os.Handler.dispatchMessage(Handler.java:110)
int nh = (int) (bitmap.getHeight() * (512.0 / bitmap.getWidth()));
Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 512, nh, true);
scaled.compress(Bitmap.CompressFormat.JPEG, 80, byteArrayOutputStream);
byte[] imageBytes = byteArrayOutputStream.toByteArray();
Log.e("Original dimensions", bitmap.getWidth() + " " + bitmap.getHeight());
Log.e("Compressed dimensions", scaled.getWidth() + " " + scaled.getHeight());
Log.e("bytes", String.valueOf(bytes));
bitmap =null;
if(code ==50) {
imageCode1 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode1);
set_img_fascia.setImageBitmap(scaled);
}
if(code ==51) {
imageCode2 = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
Log.e("image1", imageCode2);
set_img_lollypop.setImageBitmap(scaled);
...So on