ScanView.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package info.geteasy.fqreader;
  2. import android.content.res.Configuration;
  3. import android.graphics.Rect;
  4. import android.graphics.SurfaceTexture;
  5. import android.hardware.Camera;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.util.Log;
  9. import com.google.zxing.BarcodeFormat;
  10. import com.google.zxing.BinaryBitmap;
  11. import com.google.zxing.DecodeHintType;
  12. import com.google.zxing.LuminanceSource;
  13. import com.google.zxing.MultiFormatReader;
  14. import com.google.zxing.NotFoundException;
  15. import com.google.zxing.PlanarYUVLuminanceSource;
  16. import com.google.zxing.ReaderException;
  17. import com.google.zxing.common.HybridBinarizer;
  18. import java.io.IOException;
  19. import java.util.ArrayList;
  20. import java.util.Collection;
  21. import java.util.Hashtable;
  22. import java.util.Iterator;
  23. import java.util.List;
  24. import java.util.ListIterator;
  25. import java.util.Map;
  26. import io.flutter.plugin.common.EventChannel;
  27. import io.flutter.plugin.common.MethodChannel;
  28. import io.flutter.plugin.common.PluginRegistry;
  29. import io.flutter.view.FlutterView;
  30. import io.flutter.view.TextureRegistry;
  31. import static android.content.ContentValues.TAG;
  32. import static java.security.AccessController.getContext;
  33. public class ScanView {
  34. private TextureRegistry.SurfaceTextureEntry textureEntry;
  35. private Camera mCamera;
  36. private DecodeHandler mDecodeHandler;
  37. ScanView(FlutterView view,
  38. PluginRegistry.Registrar registrar,
  39. Rect viewRect,
  40. Rect scanRect,
  41. List<String> scanType,
  42. MethodChannel.Result result) {
  43. try {
  44. mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
  45. Camera.Parameters param = mCamera.getParameters();
  46. param.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
  47. param.setRotation(90);
  48. // 选择最合适的预览图像大小
  49. Camera.Size currentSize = matchSize(viewRect, param);
  50. // 设置预览图像大小
  51. param.setPreviewSize(currentSize.width, currentSize.height);
  52. mCamera.setParameters(param);
  53. mCamera.setDisplayOrientation(90); //旋转90度,变成竖屏
  54. //链接flutter纹理
  55. this.textureEntry = view.createSurfaceTexture();
  56. mCamera.setPreviewTexture(textureEntry.surfaceTexture());
  57. //返回纹理ID
  58. result.success(textureEntry.id());
  59. mDecodeHandler = new DecodeHandler(mCamera, scanType, scanRect);
  60. mDecodeHandler.registerEventChannel(registrar, textureEntry.id());
  61. } catch (Exception e) {
  62. result.error("ScanView init", e.getMessage(), null);
  63. }
  64. }
  65. void startScan() {
  66. mCamera.setOneShotPreviewCallback(mDecodeHandler);
  67. mCamera.startPreview();
  68. ;
  69. }
  70. void stopScan() {
  71. mCamera.setOneShotPreviewCallback(null);
  72. mCamera.stopPreview();
  73. }
  74. /**
  75. * 开灯
  76. */
  77. void turnOn() {
  78. Camera.Parameters param = mCamera.getParameters();
  79. param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
  80. mCamera.setParameters(param);
  81. }
  82. /**
  83. * 关灯
  84. */
  85. void turnOff() {
  86. Camera.Parameters param = mCamera.getParameters();
  87. param.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
  88. mCamera.setParameters(param);
  89. }
  90. void release() {
  91. mCamera.release();
  92. mCamera = null;
  93. textureEntry.release();
  94. textureEntry = null;
  95. mDecodeHandler.release();
  96. }
  97. /**
  98. * 选择最合适的预览图片大小
  99. *
  100. * @param viewRect
  101. * @param param
  102. * @return
  103. */
  104. private Camera.Size matchSize(Rect viewRect, Camera.Parameters param) {
  105. List<Camera.Size> sizes = param.getSupportedPreviewSizes();
  106. double viewRatio = viewRect.width() * 1.0 / viewRect.height(); // 获取控件比例
  107. Camera.Size currentSize = sizes.get(0);
  108. double currentRatio = currentSize.width * 1.0 / currentSize.height; //获取第一个预览大小的比例
  109. for (int i = 1; i < sizes.size(); i++) {
  110. Camera.Size item = sizes.get(i);
  111. double diffOld = Math.abs(currentRatio - viewRatio); //与控件比例的差异 旧
  112. double diffNew = Math.abs(item.width * 1.0 / item.height - viewRatio); //与控件比例的差异 新
  113. if (diffOld < diffNew) { //如果旧的小于新的则使用新的预览大小
  114. currentSize = item;
  115. currentRatio = item.width * 1.0 / item.height;
  116. } else if (diffOld == diffNew) {
  117. if (item.height > currentSize.height) { //如果一样且新的像素大于旧的,则用新的
  118. currentSize = item;
  119. }
  120. }
  121. }
  122. return currentSize;
  123. }
  124. }