Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 曲面没有Camera2的有效本机曲面_Android_Android Camera2_Android Textureview - Fatal编程技术网

Android 曲面没有Camera2的有效本机曲面

Android 曲面没有Camera2的有效本机曲面,android,android-camera2,android-textureview,Android,Android Camera2,Android Textureview,我已将camera2与textureVIew集成。它适用于除平板电脑以外的所有设备。当我们第一次拍摄图像时,它会崩溃并显示以下日志 Fatal Exception: java.lang.IllegalArgumentException: Surface had no valid native Surface. at android.hardware.camera2.legacy.LegacyCameraDevice.nativeGetSurfaceId(LegacyCam

我已将camera2与textureVIew集成。它适用于除平板电脑以外的所有设备。当我们第一次拍摄图像时,它会崩溃并显示以下日志

 Fatal Exception: java.lang.IllegalArgumentException: Surface had no valid native Surface.
           at android.hardware.camera2.legacy.LegacyCameraDevice.nativeGetSurfaceId(LegacyCameraDevice.java)
           at android.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceId(LegacyCameraDevice.java:658)
           at android.hardware.camera2.legacy.LegacyCameraDevice.containsSurfaceId(LegacyCameraDevice.java:678)
           at android.hardware.camera2.legacy.RequestThreadManager$2.onPictureTaken(RequestThreadManager.java:220)
           at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1248)
           at android.os.Handler.dispatchMessage(Handler.java:111)
           at android.os.Looper.loop(Looper.java:207)
           at android.hardware.camera2.legacy.CameraDeviceUserShim$CameraLooper.run(CameraDeviceUserShim.java:136)
           at java.lang.Thread.run(Thread.java:818)
下面的代码用于捕获图像

 protected void takePicture() {
        if (getContext() == null || cameraDevice == null) return;

        lockFocus();
        CameraManager manager = (CameraManager) getContext().getSystemService(Context.CAMERA_SERVICE);
        try {
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId());
            if (characteristics != null) {
                sizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.JPEG);
            }

            ImageReader reader = getImageReader();
            if (reader == null) return;

            List<Surface> outputSurfaces = getSurfaces(reader);
            final CaptureRequest.Builder captureBuilder = getCaptureBuilder(reader);

            final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() {
                @Override
                public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                    super.onCaptureCompleted(session, request, result);
                }
            };
            cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(CameraCaptureSession session) {
                    try {
                        session.capture(captureBuilder.build(), captureListener, null);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onConfigureFailed(CameraCaptureSession session) {
                }
            }, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
protectedvoid takePicture(){
if(getContext()==null | | cameraDevice==null)返回;
锁定焦点();
CameraManager=(CameraManager)getContext().getSystemService(Context.CAMERA_服务);
试一试{
CameraCharacteristics characteristics=manager.getCameraCharacteristics(cameraDevice.getId());
如果(特征!=null){
sizes=characteristics.get(CameraCharacteristics.SCALER\u STREAM\u CONFIGURATION\u MAP).getOutputSizes(ImageFormat.JPEG);
}
ImageReader=getImageReader();
if(reader==null)返回;
List outputSurfaces=getSurfaces(读卡器);
final CaptureRequest.Builder captureBuilder=getCaptureBuilder(读卡器);
final CameraCaptureSession.CaptureCallback captureListener=新建CameraCaptureSession.CaptureCallback(){
@凌驾
捕获完成后的公共void(CameraCaptureSession会话、CaptureRequest请求、TotalCaptureResult){
super.onCaptureCompleted(会话、请求、结果);
}
};
cameraDevice.createCaptureSession(outputSurfaces,新的CameraCaptureSession.StateCallback(){
@凌驾
未配置公共void(CameraCaptureSession会话){
试一试{
capture(captureBuilder.build(),captureListener,null);
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
配置文件的公共无效(CameraCaptureSession){
}
},空);
}捕获(例外e){
e、 printStackTrace();
}
}

任何帮助都将不胜感激。

如果ImageReader在相机图片捕获完成之前被垃圾收集,则可能发生这种情况


getImageReader方法是否将图像读取器存储在永久的位置(例如作为类成员)?如果没有,ImageReader中的表面就像一个弱参考,不会阻止它被删除。

可能重复-@DarshanPania该解决方案不起作用。你能给你的问题添加一些代码来帮助理解当相机捕获图像返回时会发生什么吗?@DarshanPania-我添加了代码。请检查。这是什么(图像阅读器)?它可能会返回一些错误的遗留camera2。当您的相机
CameraCharacteristics.get(CameraCharacteristics.INFO\u SUPPORTED\u HARDWARE\u LEVEL)==CameraCharacteristics.INFO\u SUPPORTED\u HARDWARE\u LEVEL\u LEGACY
时,您可能会发现使用不推荐的相机API更容易捕获JPEG。在较旧的设备上,camera2可能存在一些很难调试的小故障。