java.lang.IllegalStateException: отсоединение происходит больше раз, чем присоединение - PullRequest
1 голос
/ 23 октября 2019

Я использую библиотеку camerax 1.0.0-alpha006 Это мой Logcat

    java.lang.IllegalStateException: Detaching occurs more times than attaching
    at androidx.camera.core.DeferrableSurface.notifySurfaceDetached(DeferrableSurface.java:160)
    at androidx.camera.camera2.impl.Camera.notifyDetachFromUseCaseSurfaces(Camera.java:667)
    at androidx.camera.camera2.impl.Camera.removeOnlineUseCase(Camera.java:789)
    at androidx.camera.camera2.impl.Camera$13.run(Camera.java:772)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:65)

А это мой код для предварительного просмотра камеры и захвата изображения

    if (mPreview != null) {
        CameraX.unbindAll();
    }
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    Rational screenAspectRatio = new Rational(metrics.widthPixels, metrics.heightPixels);
    PreviewConfig config =
            new PreviewConfig.Builder()
                    .setLensFacing(CameraX.LensFacing.BACK)
                    .setTargetResolution(new Size(metrics.widthPixels, metrics.heightPixels))
                    .setTargetRotation(getDisplaySurfaceRotation())
                    .build();
    mPreview = AutoFitPreviewBuilder.Companion.build(config, textureView);
    ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
            .setLensFacing(CameraX.LensFacing.BACK)
            .setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
            .setTargetResolution(new Size(metrics.widthPixels, metrics.heightPixels))
            .setTargetRotation(getDisplaySurfaceRotation())
            .build();

    imageCapture = new ImageCapture(imageCaptureConfig);
    CameraX.bindToLifecycle((LifecycleOwner) getActivity(), mPreview, imageCapture);

А вот мойкод для захвата изображения

    public File getFile(ContentResolver contentResolver) {

    File sdcard = Environment.getExternalStorageDirectory();
    if (sdcard != null) {
        File mediaDir = new File(sdcard, "LibPoly/Images");
        if (!mediaDir.exists()) {
            mediaDir.mkdirs();
        }
        final String filePath = System.currentTimeMillis() + ".jpg";
        cameraFragment.imageCapture.takePicture(new File(mediaDir, filePath), new Executor() {
            @Override
            public void execute(Runnable runnable) {
                runnable.run();
            }
        }, new ImageCapture.OnImageSavedListener() {
            @Override
            public void onImageSaved(@NonNull File file) {
                Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                ExifInterface ei = null;
                try {

                    ei = new ExifInterface(file.getAbsolutePath());
                    if (!"LANDSCAPE".equalsIgnoreCase(orientation)) {
                        int eiAttributeInt = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                                ExifInterface.ORIENTATION_UNDEFINED);
                        switch (eiAttributeInt) {
                            case ExifInterface.ORIENTATION_ROTATE_90:
                                bitmap = rotateImage(bitmap, 90);
                                break;

                            case ExifInterface.ORIENTATION_ROTATE_180:
                                bitmap = rotateImage(bitmap, 180);
                                break;

                            case ExifInterface.ORIENTATION_ROTATE_270:
                                bitmap = rotateImage(bitmap, 270);
                                break;

                            case ExifInterface.ORIENTATION_NORMAL:
                            default:
                                bitmap = bitmap;

                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("ERROR", e.getMessage() + "");
                }

                OutputStream os = null;
                try {
                    os = new BufferedOutputStream(new FileOutputStream(file));
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
                    os.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }


                final MediaInfo image = cameraFragment
                        .getMediaFromContentUri(Utils.getImageContentUri(getContentResolver(), file), MediaInfo.SOURCE_NAME_CAMERA, MediaInfo.MediaType.IMAGE, null, context);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        addImage(image);
                    }
                });
            }

            @Override
            public void onError(@NonNull ImageCapture.ImageCaptureError
                                        imageCaptureError, @NonNull String message, @Nullable Throwable cause) {

                Log.e("ImageCaptureError", message);
            }
        });
    }
    return null;
}

Я использовал camerax версии 1.0.0-alpha005, и он работал нормально (за исключением некоторых устройств и проблема была с предварительным просмотром), и теперь я сталкиваюсь с этим сбоем.

...