我在这里玩BarCode扫描仪的原始示例:
他们可以在相机工厂内启动AutoFocus / Flash,如下所示:
- // Creates and starts the camera. Note that this uses a higher resolution in comparison
- // to other detection examples to enable the barcode detector to detect small barcodes
- // at long distances.
- CameraSource.Builder builder = new CameraSource.Builder(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();
但是,cameraSource构建器上的此方法在当前版本中消失,因此无法访问此设置.此外,我需要在使用过程中更改FlashMode,因此这也不是这样做的方法.我发现这个丑陋的解决方案来访问相机:
- public 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;
- }
虽然它有效,但它没有帮助:当调用getParameters().setFocusMode()时,我收到此异常:
- Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference
显然我正在做的不是一种正确的方法,但似乎没有关于它的文档.
谢谢你的提示.
解决方法
只需优化您的代码如下所示,您必须在构建Camera Source类后调用此方法.
- 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;
- }
这将有助于您使用camerasource对象在Google Vision Api中启用Flash.