Accessing AutoFocus/Flash with Google Vision BarCode Reader

后端 未结 3 1321
渐次进展
渐次进展 2021-01-12 07:43

I am playing with the original example of BarCode scanner here:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main

相关标签:
3条回答
  • 2021-01-12 08:13

    Here is a working kotlin variant:

    private var flashmode: Boolean = false
    private var camera: Camera? = null
    
    private fun flashOnButton() {
        camera = getCamera(cameraSource)
    
        if (camera != null) {
            try {
                val param = camera!!.parameters
    
                param.setFlashMode(if (!flashmode) Camera.Parameters.FLASH_MODE_TORCH else Camera.Parameters.FLASH_MODE_OFF)
                camera?.parameters = param
                flashmode = !flashmode
            } catch (e: java.lang.Exception) {
                e.printStackTrace()
            }
        }
    }
    
    private fun getCamera(cameraSource: CameraSource): Camera? {
        val declaredFields = CameraSource::class.java.declaredFields
    
        for (field in declaredFields) {
            if (field.type === Camera::class.java) {
                field.isAccessible = true
    
                try {
                    val camera = field.get(cameraSource) as Camera
                    return if (camera != null) {
                        camera
                    } else null
                } catch (e: IllegalAccessException) {
                    e.printStackTrace()
                }
    
                break
            }
        }
    
        return null
    }
    

    This solution works for now. But I don't know how to handle this, when android.hardware.Camera is not supported anymore in the future. Maybe there is a better solution without android.hardware.Camera?

    0 讨论(0)
  • 2021-01-12 08:14

    Just use the CameraSource directly.

    https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java

    And you will have the ability to use flash/focus.

    CameraSource
    .setFlashMode()
    .setFocusMode()
    
    0 讨论(0)
  • 2021-01-12 08:24

    Just optimize your code as following and you have to call this method after building Camera Source class.

    private Camera camera = null;
    boolean flashmode=false;
    private void flashOnButton() {
        camera=getCamera(mCameraSource);
        if (camera != null) {
            try {
                Camera.Parameters param = camera.getParameters();
             param.setFlashMode(!flashmode?Camera.Parameters.FLASH_MODE_TORCH :Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(param);
                flashmode = !flashmode;
                if(flashmode){
                    showToast("Flash Switched ON");
                }
                else {
                    showToast("Flash Switched Off");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }
    private static Camera getCamera(@NonNull CameraSource cameraSource) {
        Field[] declaredFields = CameraSource.class.getDeclaredFields();
    
        for (Field field : declaredFields) {
            if (field.getType() == Camera.class) {
                field.setAccessible(true);
                try {
                    Camera camera = (Camera) field.get(cameraSource);
                    if (camera != null) {
                        return camera;
                    }
                    return null;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                break;
            }
        }
        return null;
    }
    

    This will help you to enable flash in Google Vision Api using camerasource object.

    0 讨论(0)
提交回复
热议问题