android – 使用Google Vision BarCode Reader访问AutoFocus / Flash

前端之家收集整理的这篇文章主要介绍了android – 使用Google Vision BarCode Reader访问AutoFocus / Flash前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在这里玩BarCode扫描仪的原始示例:

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

他们可以在相机工厂内启动AutoFocus / Flash,如下所示:

  1. // Creates and starts the camera. Note that this uses a higher resolution in comparison
  2. // to other detection examples to enable the barcode detector to detect small barcodes
  3. // at long distances.
  4. CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(),barcodeDetector)
  5. .setFacing(CameraSource.CAMERA_FACING_BACK)
  6. .setRequestedPreviewSize(1600,1024)
  7. .setRequestedFps(15.0f);
  8.  
  9. // make sure that auto focus is an available option
  10. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
  11. builder = builder.setFocusMode(
  12. autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null);
  13. }
  14.  
  15. mCameraSource = builder
  16. .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
  17. .build();

但是,cameraSource构建器上的此方法在当前版本中消失,因此无法访问此设置.此外,我需要在使用过程中更改FlashMode,因此这也不是这样做的方法.我发现这个丑陋的解决方案来访问相机:

  1. public static Camera getCamera(@NonNull CameraSource cameraSource) {
  2. Field[] declaredFields = CameraSource.class.getDeclaredFields();
  3.  
  4. for (Field field : declaredFields) {
  5. if (field.getType() == Camera.class) {
  6. field.setAccessible(true);
  7. try {
  8. Camera camera = (Camera) field.get(cameraSource);
  9. if (camera != null) {
  10. return camera;
  11. }
  12.  
  13. return null;
  14. } catch (IllegalAccessException e) {
  15. e.printStackTrace();
  16. }
  17.  
  18. break;
  19. }
  20. }
  21.  
  22. return null;
  23. }

虽然它有效,但它没有帮助:当调用getParameters().setFocusMode()时,我收到此异常:

  1. Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference

显然我正在做的不是一种正确的方法,但似乎没有关于它的文档.

谢谢你的提示.

解决方法

只需优化您的代码如下所示,您必须在构建Camera Source类后调用方法.
  1. private Camera camera = null;
  2. boolean flashmode=false;
  3. private void flashOnButton() {
  4. camera=getCamera(mCameraSource);
  5. if (camera != null) {
  6. try {
  7. Camera.Parameters param = camera.getParameters();
  8. param.setFlashMode(!flashmode?Camera.Parameters.FLASH_MODE_TORCH :Camera.Parameters.FLASH_MODE_OFF);
  9. camera.setParameters(param);
  10. flashmode = !flashmode;
  11. if(flashmode){
  12. showToast("Flash Switched ON");
  13. }
  14. else {
  15. showToast("Flash Switched Off");
  16. }
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20.  
  21. }
  22. }
  23. private static Camera getCamera(@NonNull CameraSource cameraSource) {
  24. Field[] declaredFields = CameraSource.class.getDeclaredFields();
  25.  
  26. for (Field field : declaredFields) {
  27. if (field.getType() == Camera.class) {
  28. field.setAccessible(true);
  29. try {
  30. Camera camera = (Camera) field.get(cameraSource);
  31. if (camera != null) {
  32. return camera;
  33. }
  34. return null;
  35. } catch (IllegalAccessException e) {
  36. e.printStackTrace();
  37. }
  38. break;
  39. }
  40. }
  41. return null;
  42. }

这将有助于您使用camerasource对象在Google Vision Api中启用Flash.

猜你在找的Android相关文章