相机开发中,cameraDevice.getFrameConfigBuilder(FRAME_CONFIG_PICTURE) java.lang.NullPointerException

Attempt to invoke interface method 'android.hardware.camera2.impl.CameraMetadataNative android.hardware.camera2.ICameraDeviceUser.createDefaultRequest(int)' on a null object reference

java.lang.NullPointerException: Attempt to invoke interface method 'android.hardware.camera2.impl.CameraMetadataNative android.hardware.camera2.ICameraDeviceUser.createDefaultRequest(int)' on a null object reference

相机
空指针
2021-08-28 16:10:45
浏览
收藏 0
回答 6
待解决
回答 6
按赞同
/
按时间
爱吃土豆丝的打工人
1

你的cameraDevice.build  没有声明吧  代码有点少  能贴出来多一点的代码不

分享
微博
QQ
微信
回复
2021-08-28 22:47:40
wx60bdd8df940d0
1


    private Camera cameraDevice;

    /**
     * 拍照
     */
    private void takePicture(Component component) {
        HiLog.info(LABEL_LOG, "takePicture");
   
        if (cameraDevice == null || imageReceiver == null) {
            return;
        }
        // 获取拍照配置模板
        FrameConfig.Builder framePictureConfigBuilder = cameraDevice.getFrameConfigBuilder(Camera.FrameConfigType.FRAME_CONFIG_PICTURE);
        // 配置拍照Surface
        framePictureConfigBuilder.addSurface(imageReceiver.getRecevingSurface());
        FrameConfig pictureFrameConfig = framePictureConfigBuilder.build();

        //启动单帧捕获(拍照)
        cameraDevice.triggerSingleCapture(pictureFrameConfig);

    }

分享
微博
QQ
微信
回复
2021-08-30 14:32:26
wx60bdd8df940d0

代码偶尔会报上面的错误,一般能正常拍照。不知道为什么?

分享
微博
QQ
微信
回复
2021-08-30 14:34:10
wx60bdd8df940d0

private void openCamera() {

        // 图像帧数据接收处理对象
        imageReceiver = ImageReceiver.create(SCREEN_WIDTH, SCREEN_HEIGHT, ImageFormat.JPEG, IMAGE_RCV_CAPACITY);
        imageReceiver.setImageArrivalListener(this::saveImage);

        // 获取CameraKit对象
        CameraKit cameraKit = CameraKit.getInstance(getApplicationContext());
        String[] cameraList = cameraKit.getCameraIds();
        String cameraId = cameraList.length > 1 && isCameraRear ? cameraList[1] : cameraList[0];


        CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl();
        //创建相机对象。
        cameraKit.createCamera(cameraId, cameraStateCallback, creamEventHandler);
    }
 
 class CameraStateCallbackImpl extends CameraStateCallback {
        CameraStateCallbackImpl() {
        }

        //相机设备配置
        @Override
        public void onCreated(Camera camera) {
            previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();
            if (previewSurface == null) {
                HiLog.info(LABEL_LOG, "create camera filed, preview surface is null");
                return;
            }

            try {
                Thread.sleep(SLEEP_TIME);
            } catch (InterruptedException exception) {
                HiLog.info(LABEL_LOG, "Waiting to be interrupted");
            }

            //当一个新的相机设备成功创建后,首先需要对相机进行配置,调用configure(CameraConfig)方法实现配置
            CameraConfig.Builder cameraConfigBuilder = camera.getCameraConfigBuilder();
            cameraConfigBuilder.addSurface(previewSurface);// 配置预览的Surface
            cameraConfigBuilder.addSurface(imageReceiver.getRecevingSurface()); // 配置拍照的Surface
            camera.configure(cameraConfigBuilder.build()); // 相机设备配置
            cameraDevice = camera;

            //相机操作控制可用
            enableImageGroup();
        }

        //相机配置成功后,在CameraStateCallback中会触发onConfigured(Camera camera)回调,然后才可以执行相机帧捕获相关的操作
        @Override
        public void onConfigured(Camera camera) {
            //通过getFrameConfigBuilder(FRAME_CONFIG_PREVIEW)方法获取预览配置模板
            FrameConfig.Builder framePreviewConfigBuilder = camera.getFrameConfigBuilder(FRAME_CONFIG_PREVIEW);
            framePreviewConfigBuilder.addSurface(previewSurface); //配置预览surface和帧的绑定。
            try {
                // 启动循环帧捕获
                camera.triggerLoopingCapture(framePreviewConfigBuilder.build()); //启动或者更新相机帧的循环捕获。
            } catch (IllegalArgumentException e) {
                HiLog.info(LABEL_LOG, "Argument Exception");
            } catch (IllegalStateException e) {
                HiLog.info(LABEL_LOG, "State Exception");
            }
        }       
    }
 
   //拍照
 if (findComponentById(ResourceTable.Id_tack_picture_btn) instanceof Image) {
  takePictureImage = (Image) findComponentById(ResourceTable.Id_tack_picture_btn);
 }
 takePictureImage.setClickedListener(this::takePicture);
 
 /**
     * 拍照
     */
    private void takePicture(Component component) {
        HiLog.info(LABEL_LOG, "takePicture");
        if (!takePictureImage.isEnabled()) {
            HiLog.info(LABEL_LOG, "takePicture return");
            return;
        }
        if (cameraDevice == null || imageReceiver == null) {
            return;
        }
//        // 获取拍照配置模板
        FrameConfig.Builder framePictureConfigBuilder = cameraDevice.getFrameConfigBuilder(Camera.FrameConfigType.FRAME_CONFIG_PICTURE);
        // 配置拍照Surface
        framePictureConfigBuilder.addSurface(imageReceiver.getRecevingSurface());
        FrameConfig pictureFrameConfig = framePictureConfigBuilder.build();

        //启动单帧捕获(拍照)
        cameraDevice.triggerSingleCapture(pictureFrameConfig);

    }

分享
微博
QQ
微信
回复1
2021-08-30 14:42:08
爱吃土豆丝的打工人

啥叫有时候会报错  问题不能频繁复现?

 

分享
微博
QQ
微信
回复
2021-09-01 09:56:27
wx60bdd8df940d0

拍照这个应用运行在pad 上,在pad上横屏切换到竖屏,报错频率比较高,闪退,报上面错误;

但一直是横屏,偶尔报上面错误,并且闪退。 比较频繁的。

闪退后,重新进入应用,也能正常拍照。

分享
微博
QQ
微信
回复
2021-09-02 10:56:21
相关问题
如何调用config.json的数据项
3548浏览 • 2回复 待解决
Java编译说不是语句
525浏览 • 2回复 待解决
Failure[INSTALL_FAILED_BUNDLE_INFO_NOT_CONFIG]
685浏览 • 1回复 待解决
java如何设置CommonDialog的位置?
1727浏览 • 1回复 待解决
java蓝牙开发怎么取消配对
1499浏览 • 1回复 待解决
有没有相机免费推流sdk?
1548浏览 • 1回复 待解决
如何从app跳转到系统相机
915浏览 • 1回复 已解决
TV 如何用Java播放本地视频
4838浏览 • 2回复 待解决
HarmonyOS如何用Java实现配音功能
623浏览 • 1回复 待解决
OpenHarmony应用开发会支持java吗?
3531浏览 • 2回复 待解决
API 版本适配config.json
2534浏览 • 1回复 待解决
Deveco studio如何修改java文件的名称
889浏览 • 3回复 待解决
鸿蒙图片资源在Java代码如何使用
3264浏览 • 1回复 待解决