相机开发中,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
相关问题
相机开发只支持 Java 吗?
2797浏览 • 1回复 待解决
HarmonyOS renderNode的frame设置问题
569浏览 • 1回复 待解决
HarmonyOS 应用相机开发疑问
183浏览 • 1回复 待解决
求助鸿蒙开发Java ability跳转?
3918浏览 • 1回复 待解决
java蓝牙开发怎么取消配对
5024浏览 • 1回复 待解决
使用js语言如何开发相机
3064浏览 • 1回复 待解决
如何设置request.agent.Configsaveas参数
601浏览 • 1回复 待解决
服务卡片只能基于JAVA开发吗?
3461浏览 • 1回复 待解决
OpenHarmony应用开发会支持java吗?
10747浏览 • 2回复 待解决
如何调用config.json的数据项
9498浏览 • 2回复 待解决
关于Java UI拖拽式开发的问题
6032浏览 • 1回复 待解决
三方相机预览demo开发
891浏览 • 1回复 待解决