1

我曾经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();
        }
    }
4

1 回答 1

3

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

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

PS 我相信你所经历的是在华硕设备上的 Camera2 API 的错误实现。

于 2016-05-24T15:47:47.827 回答