Android google 移动视觉 api 打开相机和手电筒

Android google mobile vision api turn on camera and torch

我正在使用 android google 条形码视觉 API,我可以完美地检测到我的 QR 码。我怎样才能同时打开手电筒。晚上需要扫描二维码。这是我目前的工作代码

public class fragment_qrscan extends myFragment {

    SurfaceView cameraPreview;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_qrscan, container, false);

        cameraPreview = (SurfaceView)view.findViewById(R.id.camera_preview);

        createCameraSource();

        return view;
    }


    private void createCameraSource() {

        BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(getActivity()).build();
        final CameraSource cameraSource = new CameraSource.Builder(getActivity(),barcodeDetector)
                .setAutoFocusEnabled(true)
                .setRequestedPreviewSize(1600,1024)
                .build();

        cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1);
                    }

                    cameraSource.start(cameraPreview.getHolder());

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

                cameraSource.stop();
            }
        });

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {

            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {

                final SparseArray<Barcode> barcodes = detections.getDetectedItems();
                if (barcodes.size() >0) {
                    Log.i("myStuff",String.valueOf(barcodes.valueAt(0).displayValue));
                }
            }
        });

    }
}

一切正常我只是不知道如何正确打开手电筒并仍然使用移动视觉api。任何帮助或建议将不胜感激。

这是我的完整解决方案。通过在我的项目中包含 CameraSource.java class found here 。我可以扫描二维码,也可以打开和关闭手电筒。

public class fragment_qrscan extends myFragment {

    SurfaceView cameraPreview;
    private CameraSource mCameraSource;
    private Button btnLight;
    boolean lightOn = false;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_qrscan, container, false);

        cameraPreview = (SurfaceView) view.findViewById(R.id.camera_preview);
        btnLight = (Button) view.findViewById(R.id.btnLight);

        btnLight.setOnClickListener(
                new View.OnClickListener() {
                    public void onClick(View v) {
                        btnLightClicked();
                    }
                }
        );

        createCameraSource(true, false);

        return view;
    }

    private void btnLightClicked() {

       if (!lightOn) {
            mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
           lightOn = true;

       }
        else {
           mCameraSource.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
           lightOn = false;
       }
    }

    @SuppressLint("InlinedApi")
    private void createCameraSource(boolean autoFocus, boolean useFlash) {
        Context context = getActivity().getApplicationContext();
        BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
        CameraSource.Builder builder = new CameraSource.Builder(getActivity().getApplicationContext(), barcodeDetector)
                .setFacing(CameraSource.CAMERA_FACING_BACK)
                .setRequestedPreviewSize(1600, 1024)
                .setRequestedFps(15.0f);
        // make sure that auto focus is an available option
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            builder = builder.setFocusMode(
                    autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null);
        }

        mCameraSource = builder
                .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
                .build();

    cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1);
                }

                mCameraSource.start(cameraPreview.getHolder());

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

            mCameraSource.stop();
        }
    });

    barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
        @Override
        public void release() {

        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {

            final SparseArray<Barcode> barcodes = detections.getDetectedItems();
            if (barcodes.size() >0) {
                Log.i("myStuff",String.valueOf(barcodes.valueAt(0).displayValue));
            }
        }
    });

    }
}

我相信有一个更简洁的解决方案,但现在这段代码运行良好,自动对焦设置为 true 扫描二维码如此快速和容易,这真的很酷。即使在 3 英尺外,代码也能立即被检测到。