Проблема фокуса библиотеки ZBar - PullRequest
0 голосов
/ 13 ноября 2018

Я встроил библиотеку ZBar для QR-сканера. Но это не сработало идеально на одном из моих устройств. Камера не фокусируется автоматически на конкретном телефоне Samsung Galaxy J7 +. Мы проверили другие телефоны, такие как Motorola, Xiomi, Oneplus, и они работают нормально. Так кто-нибудь может предложить какие изменения я должен сделать? Вот мой код.

    @Override
    protected void onStart() {
        super.onStart();
        initCamera();
    }

    @Override
    protected void onStop() {
        super.onStop();
        releaseCamera();
    }

    private void initCamera() {

        autoFocusHandler = new Handler();
        mCamera = getCameraInstance();

        /* Instance barcode scanner */
        scanner = new ImageScanner();
        scanner.setConfig(0, Config.X_DENSITY, 1);
        scanner.setConfig(0, Config.Y_DENSITY, 1);
        scanner.setConfig(0, Config.ENABLE, 0);
        // Only enable the codes your app requires
        scanner.setConfig(Symbol.QRCODE, Config.ENABLE, 1);

        CameraPreview mPreview = new CameraPreview(this, mCamera, previewCb, getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS) ? autoFocusCB : null);

        if (mBinding.preview.getChildCount() > 0) {
            mBinding.preview.removeAllViews();
        }
        mBinding.preview.addView(mPreview);
    }

    /**
     * A safe way to get an instance of the Camera object.
     */
    public static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c;
    }

    private void releaseCamera() {
        if (mCamera != null) {
            previewing = false;
            mCamera.setPreviewCallback(null);
            mCamera.release();
            mCamera = null;
        }
    }

    private Runnable doAutoFocus = new Runnable() {
        public void run() {
            if (previewing)
                mCamera.autoFocus(autoFocusCB);
        }
    };

    Camera.PreviewCallback previewCb = new Camera.PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera camera) {
            Camera.Parameters parameters = camera.getParameters();
            Camera.Size size = parameters.getPreviewSize();

            Image barcode = new Image(size.width, size.height, "Y800");
            barcode.setData(data);

            int result = scanner.scanImage(barcode);

            if (result != 0) {
                previewing = false;
                mCamera.setPreviewCallback(null);
                mCamera.stopPreview();

                SymbolSet syms = scanner.getResults();
                for (Symbol sym : syms) {
                    final String code = sym.getData();               
                }
            }
        }
    };

    // Mimic continuous auto-focusing
    Camera.AutoFocusCallback autoFocusCB = new Camera.AutoFocusCallback() {
        public void onAutoFocus(boolean success, Camera camera) {
            autoFocusHandler.postDelayed(doAutoFocus, 1000);
        }
    };
...