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
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
?
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()
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.