【问题标题】:Attempt to write to field 'android.hardware.camera2.ICameraDeviceUser on a null object reference尝试在空对象引用上写入字段 'android.hardware.camera2.ICameraDeviceUser
【发布时间】:2016-05-24 11:31:52
【问题描述】:

我使用Camera2 为 API > 20 的设备实现相机预览。我在使用 android 5.0.0 的 asus_t00j 上遇到错误。我不确定它为什么会出现。

Fatal Exception: java.lang.NullPointerException: Attempt to write to field 'android.hardware.camera2.ICameraDeviceUser android.hardware.camera2.impl.CameraDeviceImpl.mRemoteDevice' on a null object reference
   at android.hardware.camera2.impl.CameraDeviceImpl.close(CameraDeviceImpl.java:773)
   at com.vyda.stream.screencast.CameraHelper.closeCamera(CameraHelper.java:410)
   at com.vyda.stream.screencast.CameraHelper.stopCameraAndRemoveWindow(CameraHelper.java:150)
   at com.vyda.stream.screencast.ScreencastService.endScreencasting(ScreencastService.java:307)
   at com.vyda.stream.screencast.ScreencastService$8.onClick(ScreencastService.java:275)
   at android.view.View.performClick(View.java:4756)
   at android.view.View$PerformClick.run(View.java:19761)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5253)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

CameraHelper::closeCamera()

private void closeCamera() {
        try {
            cameraOpenCloseLock.acquire();
            if (null != captureSession) {
                captureSession.close();
                captureSession = null;
            }
            if (null != cameraDevice) {
                cameraDevice.close();
                cameraDevice = null;
            }
        } catch (InterruptedException e) {
            throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
        } finally {
            cameraOpenCloseLock.release();
        }
    }

【问题讨论】:

  • cameraDevice 在您调用 close() 时显然为空。
  • 如果 cameraDevice 为 null,我无法调用 close。

标签: android nullpointerexception android-camera android-camera2


【解决方案1】:

captureSession.close() 是异步的,这意味着当您的代码到达cameraDevice.close() 时,底层相机对象(但不是您CameraHelpercameraDevice 成员)被销毁。对于captureSession.close()cameraDevice.close(),您应该等待onClosed() 回调。

cameraDevice.close() 的描述说明活动会话将为您关闭,因此您不需要在您的场景中调用captureSession.close()

PS 我相信您所遇到的是在 ASUS 设备上执行 Camera2 API 的错误。

【讨论】:

  • 谢谢你的回答。听起来不错,但我必须检查一下。我会让你知道我的进步:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多