当我尝试拍照时,java应用程序android崩溃(android studio 4.2.1)

zz2j4svz  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(212)

我是android编程新手,以前从未使用过java,但我正在尝试创建一个应用程序,允许用户查看检查列表,并在必要时拍照。问题是,当我点击按钮打开相机时,我看到(失败)按钮附近,当我点击拍照时,应用程序停止并崩溃,错误消息如下。
设备操作系统版本代码:29设备版本代码名称:rel设备名称:三星sm-a011f版本代码:36版本名称:1.0软件包名称:com.app.kirby构建类型:发布
java.lang.nullpointerexception:尝试在空对象引用上调用虚拟方法“int android.hardware.camera2.cameracapturesession.capture(android.hardware.camera2.cameracapturesession$capturecallback,android.os.handler)”
---------堆栈跟踪---------

com.app.kirby.CameraActivity.lockFocus(CameraActivity.java:1749)
com.app.kirby.CameraActivity.onClick(CameraActivity.java:1191)
android.view.View.performClick(View.java:7862)
android.view.View.performClickInternal(View.java:7831)
android.view.View.access$3600(View.java:879)
android.view.View$PerformClick.run(View.java:29359)
android.os.Handler.handleCallback(Handler.java:883)
android.os.Handler.dispatchMessage(Handler.java:100)
android.os.Looper.loop(Looper.java:237)
android.app.ActivityThread.main(ActivityThread.java:8173)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

---------原因---------
cameraactivity.java第1191行的一部分如下:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @SuppressLint("StringFormatInvalid")
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.snap:
                cameraCapturedOrientation = detectOrientation;
                if (isCamera2Support) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        if (CameraCharacteristics.LENS_FACING_FRONT == mCameraLensFacingDirection) {
                            captureStillPicture();
                        } else {
                            lockFocus();
                        }
                    }
                } else {
                    try {
                        camera.takePicture(shutterCallback, rawCallback, jpegCallback);
                    } catch (NullPointerException e) {
                        e.printStackTrace();
                    } catch (RuntimeException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
            case R.id.next:
                int totalCount = totalImageCount();
                if (temp.size() == 0 || totalCount < 0) {
                    Toast.makeText(CameraActivity.this, getString(R.string.please_add_image), Toast.LENGTH_SHORT).show();
                } else if (totalCount > Constants.IMAGE_COUNT) {
                    String number = numberFormat.format(Constants.IMAGE_COUNT);
                    Toast.makeText(CameraActivity.this, String.format(getString(R.string.error_msg_to_imgcount), number), Toast.LENGTH_SHORT).show();
                } else if (selectedImages.size() == 0 && totalCount == 0) {
                    Toast.makeText(CameraActivity.this, getString(R.string.please_select_images), Toast.LENGTH_SHORT).show();
                } else {
                    switch (from) {
                        case "edit": {
                            Intent i = new Intent();
                            i.putExtra("from", from);
                            itemMap.setPhotos(selectedImages);
                            i.putExtra("data", itemMap);
                            i.putExtra("from", from);
                            setResult(Activity.RESULT_OK, i);
                            finish();
                        }
                        break;
                        case "home": {
                            Intent i = new Intent(CameraActivity.this, AddProductDetail.class);
                            i.putExtra("from", from);
                            itemMap.setPhotos(selectedImages);
                            i.putExtra("data", itemMap);
                            i.putExtra("from", from);
                            startActivity(i);
                            finish();
                        }
                        break;
                        case "add": {
                            Intent i = new Intent(CameraActivity.this, AddProductDetail.class);
                            i.putExtra("from", from);
                            itemMap.setPhotos(selectedImages);
                            i.putExtra("data", itemMap);
                            i.putExtra("from", from);
//                            startActivity(i);
                            setResult(Activity.RESULT_OK, i);
                            finish();
                        }
                        break;
                        default: {
                            Intent i = new Intent(CameraActivity.this, AddProductDetail.class);
                            i.putExtra("from", from);
                            startActivity(i);
                        }
                        break;
                    }

                }
                break;

下面是cameraactivity.java第1749行的一部分:

/**
     * Lock the focus as the first step for a still image capture.
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void lockFocus() {
        try {
            // This is how to tell the camera to lock focus.
            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                    CameraMetadata.CONTROL_AF_TRIGGER_START);
            // Tell #mCaptureCallback to wait for the lock.
            mState = STATE_WAITING_LOCK;
            mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                    mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    /**
     * Unlock the focus. This method should be called when still image capture sequence is
     * finished.
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void unlockFocus() {
        try {
            // Reset the auto-focus trigger
            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                    CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
            mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                    mBackgroundHandler);
            // After this, the camera will go back to the normal state of preview.
            mState = STATE_PREVIEW;
            mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback,
                    mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    /**
     * Run the precapture sequence for capturing a still image. This method should be called when
     * we get a response in {@link #mCaptureCallback} from {@link #lockFocus()}.
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void runPreCaptureSequence() {
        try {
            // This is how to tell the camera to trigger.
            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
            // Tell #mCaptureCallback to wait for the precapture sequence to be set.
            mState = STATE_WAITING_PRECAPTURE;
            mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                    mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
        if (mFlashSupported && flash) {
            requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
            requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
        } else if (mFlashSupported) {
            requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
            requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
        }
    }

完整文件下载地址:
cameraactivity.java

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题