Android java.lang.OutOfMemoryError处理来自摄像头的14个数据时出错

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

我正在制作一个审计应用程序,我必须从单选按钮和14个检查点的图像中收集是/否

该应用程序在我的设备上运行良好,该设备有Android 10设备,但在以任意方式收集4-6幅图像并在各自的Imageview和collect Byte[]字符串变量中显示后,在一些设备上(如牛轧糖设备)进行测试时,该应用程序崩溃,日志中也没有错误(现在通过调试器发现,请参见下文)。请看一下摄像机的编码。应用程序在返回活动时单击照片后崩溃


 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