From f3b4105ff1f352a80caa1a68a30d1119b9be36c7 Mon Sep 17 00:00:00 2001 From: Ailiwean <1581209979@qq.com> Date: Sun, 27 Sep 2020 16:02:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B1=80=E9=83=A8=E6=B5=8B?= =?UTF-8?q?=E5=85=89=EF=BC=8C=E9=80=82=E9=85=8D=E6=A8=AA=E7=AB=96=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/inspectionProfiles/Project_Default.xml | 61 +++++++ .idea/smartfox_info.xml | 6 + app/build.gradle | 4 +- .../google/android/cameraview/Camera1.java | 31 ++-- .../cameraview/TextureViewPreview.java | 42 +---- .../google/android/cameraview/Camera2.java | 29 +-- .../android/cameraview/PreviewImpl.java | 2 - .../main/java/com/ailiwean/core/Config.java | 17 ++ .../com/ailiwean/core/WorkThreadServer.java | 2 +- .../com/ailiwean/core/able/AbleManager.kt | 4 +- .../com/ailiwean/core/able/LighSolveAble.java | 2 - .../ailiwean/core/able/PixsValuesAble.java | 1 - .../ailiwean/core/able/XQRScanAbleRotate.java | 15 +- .../ailiwean/core/able/XQRScanCrudeAble.java | 1 - .../ailiwean/core/able/XQRScanZoomAble.java | 2 - .../com/ailiwean/core/helper/LightHelper.java | 2 +- .../com/ailiwean/core/helper/ScanHelper.java | 167 +++++++++++++----- .../com/ailiwean/core/helper/ZoomHelper.kt | 1 + .../com/ailiwean/core/view/FreeZxingView.kt | 2 - .../core/zxing/CustomMultiFormatReader.java | 16 +- .../com/ailiwean/core/zxing/ScanRect.java | 15 ++ .../zxing/core/PlanarYUVLuminanceSource.java | 3 - .../core/common/HybridBinarizerCrude.java | 5 +- .../core/zxing/core/oned/OneDReader.java | 2 +- .../android/cameraview/BaseCameraView.kt | 2 +- .../google/android/cameraview/CameraView.java | 24 ++- .../DisplayOrientationDetector.java | 21 ++- .../layout-land/nbzxing_default_floorview.xml | 41 +++++ .../res/layout/nbzxing_default_floorview.xml | 14 +- .../module_grayscale/OverBrightScale.java | 1 - .../module_grayscale/OverDarkScale.java | 1 - 31 files changed, 385 insertions(+), 151 deletions(-) create mode 100644 .idea/smartfox_info.xml create mode 100644 module_camera/src/main/res/layout-land/nbzxing_default_floorview.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 5abe40b..890f47c 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,8 +1,69 @@ \ No newline at end of file diff --git a/.idea/smartfox_info.xml b/.idea/smartfox_info.xml new file mode 100644 index 0000000..1c2584f --- /dev/null +++ b/.idea/smartfox_info.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 1e2111e..caa056b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,8 +33,8 @@ android { } debug { - minifyEnabled true - shrinkResources true + minifyEnabled false + shrinkResources false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } diff --git a/module_camera/src/main/api14/com/google/android/cameraview/Camera1.java b/module_camera/src/main/api14/com/google/android/cameraview/Camera1.java index a64bb92..d5995b1 100644 --- a/module_camera/src/main/api14/com/google/android/cameraview/Camera1.java +++ b/module_camera/src/main/api14/com/google/android/cameraview/Camera1.java @@ -18,9 +18,9 @@ import android.annotation.SuppressLint; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.SurfaceTexture; import android.hardware.Camera; -import android.util.Log; import android.view.SurfaceHolder; import androidx.collection.SparseArrayCompat; @@ -28,9 +28,9 @@ import com.ailiwean.core.Config; import com.ailiwean.core.helper.CameraHelper; import com.ailiwean.core.helper.LightHelper; +import com.ailiwean.core.helper.ScanHelper; import java.io.IOException; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; @@ -290,10 +290,13 @@ void setDisplayOrientation(int displayOrientation) { return; } mDisplayOrientation = displayOrientation; - if (isCameraOpened()) { - mCameraParameters.setRotation(calcCameraRotation(displayOrientation)); - mCamera.setParameters(mCameraParameters); - mCamera.setDisplayOrientation(calcDisplayOrientation(displayOrientation)); + try { + if (isCameraOpened()) { + mCameraParameters.setRotation(calcCameraRotation(displayOrientation)); + mCamera.setParameters(mCameraParameters); + mCamera.setDisplayOrientation(calcDisplayOrientation(displayOrientation)); + } + } catch (Exception ignored) { } } @@ -584,12 +587,18 @@ protected void rectMeteringWithFocus() { if (Config.scanRect == null || Config.scanRect.getRect() == null) return; - int left = (int) (2000 * Config.scanRect.getRect().top) - 1000; - int top = (int) (2000 * (1 - Config.scanRect.getRect().right)) - 1000; - int right = (int) (2000 * Config.scanRect.getRect().bottom) - 1000; - int bottom = (int) (2000 * (1 - Config.scanRect.getRect().left)) - 1000; + RectF cropRect = ScanHelper.copyRect(Config.scanRect.getRect()); + cropRect.left += (cropRect.right - cropRect.left) / 4; + cropRect.right -= (cropRect.right - cropRect.left) / 4; + cropRect.top += (cropRect.bottom - cropRect.top) / 4; + cropRect.bottom -= (cropRect.bottom - cropRect.top) / 4; + + int left = (int) (2000 * cropRect.top) - 1000; + int top = (int) (2000 * (1 - cropRect.right)) - 1000; + int right = (int) (2000 * cropRect.bottom) - 1000; + int bottom = (int) (2000 * (1 - cropRect.left)) - 1000; - Rect realRect = new Rect(left , top, right, bottom); + Rect realRect = new Rect(left, top, right, bottom); List areas = Collections.singletonList(new Camera.Area(realRect, 1000)); mCameraParameters.setFocusAreas(areas); mCameraParameters.setMeteringAreas(areas); diff --git a/module_camera/src/main/api14/com/google/android/cameraview/TextureViewPreview.java b/module_camera/src/main/api14/com/google/android/cameraview/TextureViewPreview.java index 6a56f5b..998fd70 100644 --- a/module_camera/src/main/api14/com/google/android/cameraview/TextureViewPreview.java +++ b/module_camera/src/main/api14/com/google/android/cameraview/TextureViewPreview.java @@ -18,21 +18,21 @@ import android.annotation.TargetApi; import android.content.Context; +import android.content.res.Configuration; import android.graphics.Matrix; import android.graphics.SurfaceTexture; -import android.util.Log; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import com.ailiwean.core.Config; +import com.ailiwean.core.Utils; @TargetApi(14) class TextureViewPreview extends PreviewImpl { private final TextureView mTextureView; - private int mDisplayOrientation; TextureViewPreview(Context context, ViewGroup parent) { @@ -65,6 +65,7 @@ public void onSurfaceTextureUpdated(SurfaceTexture surface) { } }); + } @TargetApi(15) @@ -74,36 +75,6 @@ void setBufferSize(int widthData, int heightData) { Config.scanRect.setDataY(heightData); if (getSurfaceTexture() != null) getSurfaceTexture().setDefaultBufferSize(widthData, heightData); - else { - TextureView.SurfaceTextureListener listener = mTextureView.getSurfaceTextureListener(); - mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { - @Override - public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { - if (listener != null) - listener.onSurfaceTextureAvailable(surface, width, height); - getSurfaceTexture().setDefaultBufferSize(widthData, heightData); - } - - @Override - public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { - if (listener != null) - listener.onSurfaceTextureSizeChanged(surface, width, height); - } - - @Override - public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { - if (listener != null) - return listener.onSurfaceTextureDestroyed(surface); - return false; - } - - @Override - public void onSurfaceTextureUpdated(SurfaceTexture surface) { - if (listener != null) - listener.onSurfaceTextureUpdated(surface); - } - }); - } } @Override @@ -138,11 +109,16 @@ boolean isReady() { } /** - * Configures the transform matrix for TextureView based on {@link #mDisplayOrientation} and + * Configures the transform matrix for TextureView based on {@link Config} and * the surface size. */ void configureTransform() { Matrix matrix = new Matrix(); + + if (Utils.getContext().getResources().getConfiguration().orientation == + Configuration.ORIENTATION_LANDSCAPE && mDisplayOrientation == 0) + mDisplayOrientation = Config.displayOrientation; + if (mDisplayOrientation % 180 == 90) { final int width = getWidth(); final int height = getHeight(); diff --git a/module_camera/src/main/api21/com/google/android/cameraview/Camera2.java b/module_camera/src/main/api21/com/google/android/cameraview/Camera2.java index 8157144..0f64bf3 100644 --- a/module_camera/src/main/api21/com/google/android/cameraview/Camera2.java +++ b/module_camera/src/main/api21/com/google/android/cameraview/Camera2.java @@ -19,7 +19,7 @@ import android.content.Context; import android.graphics.ImageFormat; import android.graphics.Rect; -import android.hardware.camera2.CameraAccessException; +import android.graphics.RectF; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; @@ -32,7 +32,6 @@ import android.media.Image; import android.media.ImageReader; import android.os.Build; -import android.util.Log; import android.util.SparseIntArray; import android.view.Surface; @@ -40,10 +39,10 @@ import com.ailiwean.core.Config; import com.ailiwean.core.helper.CameraHelper; +import com.ailiwean.core.helper.ScanHelper; import java.nio.ByteBuffer; import java.util.Arrays; -import java.util.Collections; import java.util.Set; import java.util.SortedSet; @@ -909,17 +908,23 @@ protected void rectMeteringWithFocus() { if (Config.scanRect == null || Config.scanRect.getRect() == null) return; - Rect rect = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); - if (rect == null) - rect = new Rect(0, 0, 1, 1); + Rect dateRect = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); + if (dateRect == null) + dateRect = new Rect(0, 0, 1, 1); - int dataWidth = rect.width() - 1; - int dataHeight = rect.height() - 1; + int dataWidth = dateRect.width() - 1; + int dataHeight = dateRect.height() - 1; - int left = (int) (Config.scanRect.getRect().top * dataWidth); - int top = (int) ((1f - Config.scanRect.getRect().right) * dataHeight); - int right = (int) (Config.scanRect.getRect().bottom * dataWidth); - int bottom = (int) ((1f - (Config.scanRect.getRect().left)) * dataHeight); + RectF cropRect = ScanHelper.copyRect(Config.scanRect.getRect()); + cropRect.left += (cropRect.right - cropRect.left) / 4; + cropRect.right -= (cropRect.right - cropRect.left) / 4; + cropRect.top += (cropRect.bottom - cropRect.top) / 4; + cropRect.bottom -= (cropRect.bottom - cropRect.top) / 4; + + int left = (int) (cropRect.top * dataWidth); + int top = (int) ((1f - cropRect.right) * dataHeight); + int right = (int) (cropRect.bottom * dataWidth); + int bottom = (int) ((1f - cropRect.left) * dataHeight); Rect realRect = new Rect(left, top, right, bottom); MeteringRectangle[] meteringRectangles = new MeteringRectangle[]{new MeteringRectangle(realRect, 1000)}; diff --git a/module_camera/src/main/base/com/google/android/cameraview/PreviewImpl.java b/module_camera/src/main/base/com/google/android/cameraview/PreviewImpl.java index a20774f..627d836 100644 --- a/module_camera/src/main/base/com/google/android/cameraview/PreviewImpl.java +++ b/module_camera/src/main/base/com/google/android/cameraview/PreviewImpl.java @@ -17,11 +17,9 @@ package com.google.android.cameraview; import android.os.Handler; -import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.View; -import android.view.ViewGroup; /** diff --git a/module_camera/src/main/java/com/ailiwean/core/Config.java b/module_camera/src/main/java/com/ailiwean/core/Config.java index 66cc66b..7829cc1 100644 --- a/module_camera/src/main/java/com/ailiwean/core/Config.java +++ b/module_camera/src/main/java/com/ailiwean/core/Config.java @@ -35,12 +35,29 @@ public class Config { //扫码区域 public static ScanRect scanRect; + + public static int displayOrientation; + //灰度算法类路径 public static final String GARY_SCALE_PATH = "com.ailiwean.module_grayscale.GrayScaleDispatch"; public static void initConfig() { currentZoom = 0f; + displayOrientation = 0; scanRect = new ScanRect(); } + //屏幕方向 + public static boolean is0() { + return displayOrientation == 0; + } + + public static boolean is90() { + return displayOrientation == 90; + } + + public static boolean is270() { + return displayOrientation == 270; + } + } diff --git a/module_camera/src/main/java/com/ailiwean/core/WorkThreadServer.java b/module_camera/src/main/java/com/ailiwean/core/WorkThreadServer.java index cc4b21b..300366c 100644 --- a/module_camera/src/main/java/com/ailiwean/core/WorkThreadServer.java +++ b/module_camera/src/main/java/com/ailiwean/core/WorkThreadServer.java @@ -31,7 +31,7 @@ private WorkThreadServer() { new ThreadPoolExecutor.DiscardOldestPolicy()); else executor = new RespectScalePool( corePoolSize, corePoolSize, keepAliveTime, TimeUnit.SECONDS, - RespectScaleQueue.create(maximumPoolSize / 3 * 2, maximumPoolSize / 3), + RespectScaleQueue.create(maximumPoolSize / 2, maximumPoolSize / 2), new RespectScalePool.RespectScalePolicy()); } diff --git a/module_camera/src/main/java/com/ailiwean/core/able/AbleManager.kt b/module_camera/src/main/java/com/ailiwean/core/able/AbleManager.kt index 257378f..8dae4f1 100644 --- a/module_camera/src/main/java/com/ailiwean/core/able/AbleManager.kt +++ b/module_camera/src/main/java/com/ailiwean/core/able/AbleManager.kt @@ -45,10 +45,10 @@ class AbleManager private constructor(handler: Handler) : PixsValuesAble(handler fun loadAbility() { ableList.clear() ableList.add(XQRScanCrudeAble(handlerHolder.get())) - ableList.add(XQRScanFineAble(handlerHolder.get())) ableList.add(XQRScanZoomAble(handlerHolder.get())) ableList.add(XQRScanAbleRotate(handlerHolder.get())) ableList.add(LighSolveAble(handlerHolder.get())) +// ableList.add(XQRScanFineAble(handlerHolder.get())) // ableList.add(XQRScanAble(handler)) // ableList.add(GrayscaleStrengAble(handler)) // ableList.add(XQRScanFastAble(handler)) @@ -96,7 +96,7 @@ class AbleManager private constructor(handler: Handler) : PixsValuesAble(handler override fun release() { ableList.forEach { - it.release() + it.release() } ableList.clear() server.quit() diff --git a/module_camera/src/main/java/com/ailiwean/core/able/LighSolveAble.java b/module_camera/src/main/java/com/ailiwean/core/able/LighSolveAble.java index 9a85dc7..e6f4caf 100644 --- a/module_camera/src/main/java/com/ailiwean/core/able/LighSolveAble.java +++ b/module_camera/src/main/java/com/ailiwean/core/able/LighSolveAble.java @@ -1,8 +1,6 @@ package com.ailiwean.core.able; import android.os.Handler; -import android.os.Message; -import android.util.Log; import com.ailiwean.core.Config; import com.ailiwean.core.helper.LightHelper; diff --git a/module_camera/src/main/java/com/ailiwean/core/able/PixsValuesAble.java b/module_camera/src/main/java/com/ailiwean/core/able/PixsValuesAble.java index c8014c5..a502760 100644 --- a/module_camera/src/main/java/com/ailiwean/core/able/PixsValuesAble.java +++ b/module_camera/src/main/java/com/ailiwean/core/able/PixsValuesAble.java @@ -2,7 +2,6 @@ import android.os.Handler; import android.os.Message; -import android.util.Log; import com.ailiwean.core.zxing.CustomMultiFormatReader; import com.ailiwean.core.zxing.core.Binarizer; diff --git a/module_camera/src/main/java/com/ailiwean/core/able/XQRScanAbleRotate.java b/module_camera/src/main/java/com/ailiwean/core/able/XQRScanAbleRotate.java index 5032b70..3835522 100644 --- a/module_camera/src/main/java/com/ailiwean/core/able/XQRScanAbleRotate.java +++ b/module_camera/src/main/java/com/ailiwean/core/able/XQRScanAbleRotate.java @@ -1,12 +1,18 @@ package com.ailiwean.core.able; +import android.graphics.Rect; import android.os.Handler; import android.os.Message; import com.ailiwean.core.Config; import com.ailiwean.core.helper.ScanHelper; import com.ailiwean.core.zxing.core.BinaryBitmap; +import com.ailiwean.core.zxing.core.PlanarYUVLuminanceSource; import com.ailiwean.core.zxing.core.Result; +import com.ailiwean.core.zxing.core.common.HybridBinarizerFine; + +import static com.ailiwean.core.helper.ScanHelper.buildLuminanceSource; +import static com.ailiwean.core.helper.ScanHelper.getScanByteRect; /** * @Package: com.ailiwean.core.able @@ -23,7 +29,7 @@ public class XQRScanAbleRotate extends PixsValuesAble { XQRScanAbleRotate(Handler handler) { super(handler); } - + @Override public void cusAction(byte[] data, int dataWidth, int dataHeight) { if (result != null && !isNative) @@ -34,9 +40,10 @@ public void cusAction(byte[] data, int dataWidth, int dataHeight) { dataWidth += dataHeight; dataHeight = dataWidth - dataHeight; dataWidth -= dataHeight; - //先生产扫码需要的BinaryBitmap - binaryBitmap = ScanHelper.byteToBinaryBitmap(data, dataWidth, dataHeight); - result = reader.decode(binaryBitmap); + + Rect rect = getScanByteRect(dataWidth, dataHeight); + PlanarYUVLuminanceSource source = buildLuminanceSource(data, dataWidth, dataHeight, rect); + result = toLaunchParse(new HybridBinarizerFine(source)); if (result != null) { sendMessage(Config.SCAN_RESULT, covertResultRotate(result)); } diff --git a/module_camera/src/main/java/com/ailiwean/core/able/XQRScanCrudeAble.java b/module_camera/src/main/java/com/ailiwean/core/able/XQRScanCrudeAble.java index bf41268..9e94c82 100644 --- a/module_camera/src/main/java/com/ailiwean/core/able/XQRScanCrudeAble.java +++ b/module_camera/src/main/java/com/ailiwean/core/able/XQRScanCrudeAble.java @@ -1,7 +1,6 @@ package com.ailiwean.core.able; import android.os.Handler; -import android.os.Message; import com.ailiwean.core.Config; import com.ailiwean.core.helper.ScanHelper; diff --git a/module_camera/src/main/java/com/ailiwean/core/able/XQRScanZoomAble.java b/module_camera/src/main/java/com/ailiwean/core/able/XQRScanZoomAble.java index 5af447b..16a1e93 100644 --- a/module_camera/src/main/java/com/ailiwean/core/able/XQRScanZoomAble.java +++ b/module_camera/src/main/java/com/ailiwean/core/able/XQRScanZoomAble.java @@ -1,8 +1,6 @@ package com.ailiwean.core.able; import android.os.Handler; -import android.os.Message; -import android.util.Log; import com.ailiwean.core.Config; import com.ailiwean.core.helper.ScanHelper; diff --git a/module_camera/src/main/java/com/ailiwean/core/helper/LightHelper.java b/module_camera/src/main/java/com/ailiwean/core/helper/LightHelper.java index 062211a..d1715a7 100644 --- a/module_camera/src/main/java/com/ailiwean/core/helper/LightHelper.java +++ b/module_camera/src/main/java/com/ailiwean/core/helper/LightHelper.java @@ -16,7 +16,7 @@ public class LightHelper { static long lastRecordTime = System.currentTimeMillis(); //扫描间隔 - static int waitScanTime = 300; + static int waitScanTime = 500; static int lastAvDark = 0; diff --git a/module_camera/src/main/java/com/ailiwean/core/helper/ScanHelper.java b/module_camera/src/main/java/com/ailiwean/core/helper/ScanHelper.java index 8f275f1..3bb4887 100644 --- a/module_camera/src/main/java/com/ailiwean/core/helper/ScanHelper.java +++ b/module_camera/src/main/java/com/ailiwean/core/helper/ScanHelper.java @@ -2,14 +2,11 @@ import android.graphics.PointF; import android.graphics.Rect; -import android.util.Log; +import android.graphics.RectF; import com.ailiwean.core.Config; -import com.ailiwean.core.zxing.core.BinaryBitmap; import com.ailiwean.core.zxing.core.PlanarYUVLuminanceSource; import com.ailiwean.core.zxing.core.ResultPoint; -import com.ailiwean.core.zxing.core.common.HybridBinarizer; -import com.ailiwean.core.zxing.core.common.HybridBinarizerFine; /** * @Package: com.ailiwean.core.helper @@ -20,22 +17,13 @@ */ public class ScanHelper { - /*** - * 字节转BinaryBitmap - */ - public static BinaryBitmap byteToBinaryBitmap(byte[] bytes, int dataWidth, int dataHeight) { - Rect rect = getScanByteRect(dataWidth, dataHeight); - PlanarYUVLuminanceSource source = buildLuminanceSource(bytes, dataWidth, dataHeight, rect); - return new BinaryBitmap(new HybridBinarizerFine(source)); - } - /*** * 旋转矩形 -90 * @param rect * @return */ - private static Rect rotateRect(Rect rect) { - Rect rect1 = new Rect(); + public static RectF rotateUnCloseWise(RectF rect) { + RectF rect1 = new RectF(); rect1.left = rect.top; rect1.top = rect.left; rect1.right = rect.bottom; @@ -43,6 +31,54 @@ private static Rect rotateRect(Rect rect) { return rect1; } + private static RectF adapterRect(RectF rect) { + RectF rect1 = new RectF(); + rect1.top = rect.left; + rect1.right = rect.bottom; + rect1.bottom = rect.right; + rect1.left = rect.top; + return rect1; + } + + public static RectF adapter90(RectF rect) { + rect = adapterRect(rect); + RectF rect1 = new RectF(); + rect1.left = 1 - rect.right; + rect1.top = rect.top; + rect1.right = 1 - rect.left; + rect1.bottom = rect.bottom; + return rect1; + } + + public static RectF adapter270(RectF rectF) { + rectF = adapterRect(rectF); + RectF rect1 = new RectF(); + rect1.left = rectF.left; + rect1.top = 1 - rectF.bottom; + rect1.right = rectF.right; + rect1.bottom = 1 - rectF.top; + return rect1; + } + + public static Rect copyRect(Rect rect) { + Rect result = new Rect(); + result.left = rect.left; + result.top = rect.top; + result.right = rect.right; + result.bottom = rect.bottom; + return result; + } + + public static RectF copyRect(RectF rectF) { + RectF result = new RectF(); + result.left = rectF.left; + result.top = rectF.top; + result.right = rectF.right; + result.bottom = rectF.bottom; + return result; + } + + /*** * 二维码坐标转换屏幕坐标 * @param point @@ -67,13 +103,31 @@ public static PointF rotatePoint(ResultPoint[] point) { float preY = Config.scanRect.getPreY(); float extraX = Config.scanRect.getExtraX(); float extraY = Config.scanRect.getExtraY(); - float aspeX = (preX + extraX) / (float) Config.scanRect.getDataY(); - float aspeY = (preY + extraY) / (float) Config.scanRect.getDataX(); - float relatPointX = preX + extraX / 2 - (Config.scanRect.getScanR().top + avargPoint.y) * aspeX; - float relatPointY = (Config.scanRect.getScanR().left + avargPoint.x) * aspeY - extraY / 2; - return new PointF(relatPointX, relatPointY); + float aspeX, aspeY; + + if (Config.is90() || Config.is270()) { + aspeX = (preX + extraX) / (float) Config.scanRect.getDataX(); + aspeY = (preY + extraY) / (float) Config.scanRect.getDataY(); + } else { + aspeX = (preX + extraX) / (float) Config.scanRect.getDataY(); + aspeY = (preY + extraY) / (float) Config.scanRect.getDataX(); + } + + float relatPointX, relatPointY; + if (Config.is90()) { + relatPointX = (Config.scanRect.getScanR().left + avargPoint.x) * aspeX - extraX / 2; + relatPointY = (Config.scanRect.getScanR().top + avargPoint.y) * aspeY - extraY / 2; + } else if (Config.is270()) { + relatPointX = preX - (Config.scanRect.getScanR().left + avargPoint.x) * aspeX + extraX / 2; + relatPointY = preY - (Config.scanRect.getScanR().top + avargPoint.y) * aspeY + extraY / 2; + } else { + relatPointX = preX + extraX / 2 - (Config.scanRect.getScanR().top + avargPoint.y) * aspeX; + relatPointY = (Config.scanRect.getScanR().left + avargPoint.x) * aspeY - extraY / 2; + } + + return new PointF(relatPointX, relatPointY); } /*** @@ -100,11 +154,31 @@ public static PointF rotatePointR(ResultPoint[] point) { float preY = Config.scanRect.getPreY(); float extraX = Config.scanRect.getExtraX(); float extraY = Config.scanRect.getExtraY(); - float aspeX = (preX + extraX) / (float) Config.scanRect.getDataY(); - float aspeY = (preY + extraY) / (float) Config.scanRect.getDataX(); - float relatPointX = (Config.scanRect.getScanRR().left + avargPoint.x) * aspeX - extraX / 2; - float relatPointY = (Config.scanRect.getScanRR().top + avargPoint.y) * aspeY - extraY / 2; + float aspeX, aspeY; + + if (Config.is90() || Config.is270()) { + aspeX = (preX + extraX) / (float) Config.scanRect.getDataX(); + aspeY = (preY + extraY) / (float) Config.scanRect.getDataY(); + } else { + aspeX = (preX + extraX) / (float) Config.scanRect.getDataY(); + aspeY = (preY + extraY) / (float) Config.scanRect.getDataX(); + } + + float relatPointX, relatPointY; + + if (Config.is90()) { + relatPointX = (Config.scanRect.getScanRR().top + avargPoint.y) * aspeX - extraX / 2; + relatPointY = (Config.scanRect.getScanRR().left - avargPoint.x + + Config.scanRect.getScanRR().width()) * aspeY - extraY / 2; + } else if (Config.is270()) { + relatPointX = preX - (Config.scanRect.getScanRR().top + avargPoint.y) * aspeX + extraX / 2; + relatPointY = preY - (Config.scanRect.getScanRR().left - avargPoint.x + + Config.scanRect.getScanRR().width()) * aspeY + extraY / 2; + } else { + relatPointX = (Config.scanRect.getScanRR().left + avargPoint.x) * aspeX - extraX / 2; + relatPointY = (Config.scanRect.getScanRR().top + avargPoint.y) * aspeY - extraY / 2; + } return new PointF(relatPointX, relatPointY); } @@ -136,29 +210,34 @@ public static PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int wid */ public static Rect getScanByteRect(int dataWidth, int dataHeight) { - if (Config.scanRect.getRect() == null) - return new Rect(0, 0, 0, 0); + try { + if (Config.scanRect.getRect() == null) + return new Rect(0, 0, 0, 0); - //默认采集的数据 - if (dataWidth > dataHeight) { + RectF cropRect = Config.scanRect.getRect(); - if (Config.scanRect.getScanR() == null) { - Config.scanRect.setScanR(new Rect()); - Config.scanRect.getScanR().left = (int) (Config.scanRect.getRect().top * dataWidth); - Config.scanRect.getScanR().top = (int) ((1f - Config.scanRect.getRect().right) * dataHeight); - Config.scanRect.getScanR().right = (int) (Config.scanRect.getRect().bottom * dataWidth); - Config.scanRect.getScanR().bottom = (int) ((1f - (Config.scanRect.getRect().left)) * dataHeight); + //默认采集的数据 + if (dataWidth > dataHeight) { + if (Config.scanRect.getScanR() == null) { + Config.scanRect.setScanR(new Rect()); + Config.scanRect.getScanR().left = (int) (cropRect.top * dataWidth); + Config.scanRect.getScanR().top = (int) ((1f - cropRect.right) * dataHeight); + Config.scanRect.getScanR().right = (int) (cropRect.bottom * dataWidth); + Config.scanRect.getScanR().bottom = (int) ((1f - (cropRect.left)) * dataHeight); + } + return Config.scanRect.getScanR(); + } else { + if (Config.scanRect.getScanRR() == null) { + Config.scanRect.setScanRR(new Rect()); + Config.scanRect.getScanRR().left = (int) (cropRect.left * dataWidth); + Config.scanRect.getScanRR().top = (int) (cropRect.top * dataHeight); + Config.scanRect.getScanRR().right = (int) (cropRect.right * dataWidth); + Config.scanRect.getScanRR().bottom = (int) (cropRect.bottom * dataHeight); + } + return Config.scanRect.getScanRR(); } - return Config.scanRect.getScanR(); - } else { - if (Config.scanRect.getScanRR() == null) { - Config.scanRect.setScanRR(new Rect()); - Config.scanRect.getScanRR().left = (int) (Config.scanRect.getRect().left * dataWidth); - Config.scanRect.getScanRR().top = (int) (Config.scanRect.getRect().top * dataHeight); - Config.scanRect.getScanRR().right = (int) (Config.scanRect.getRect().right * dataWidth); - Config.scanRect.getScanRR().bottom = (int) (Config.scanRect.getRect().bottom * dataHeight); - } - return Config.scanRect.getScanRR(); + } catch (Exception e) { + return new Rect(0, 0, 0, 0); } } diff --git a/module_camera/src/main/java/com/ailiwean/core/helper/ZoomHelper.kt b/module_camera/src/main/java/com/ailiwean/core/helper/ZoomHelper.kt index 148e706..faf2d38 100644 --- a/module_camera/src/main/java/com/ailiwean/core/helper/ZoomHelper.kt +++ b/module_camera/src/main/java/com/ailiwean/core/helper/ZoomHelper.kt @@ -18,6 +18,7 @@ object ZoomHelper { @SuppressLint("ClickableViewAccessibility") fun toAutoZoom(view: BaseCameraView) { + Config.currentZoom = 0f view.setOnTouchListener(object : OnGestureListener(view.context) { override fun onStepFingerChange(total: Float, offset: Float) { diff --git a/module_camera/src/main/java/com/ailiwean/core/view/FreeZxingView.kt b/module_camera/src/main/java/com/ailiwean/core/view/FreeZxingView.kt index b26f42f..3626ff3 100644 --- a/module_camera/src/main/java/com/ailiwean/core/view/FreeZxingView.kt +++ b/module_camera/src/main/java/com/ailiwean/core/view/FreeZxingView.kt @@ -1,6 +1,5 @@ package com.ailiwean.core.view -import android.app.Activity import android.content.ContentUris import android.content.Context import android.database.Cursor @@ -12,7 +11,6 @@ import android.net.Uri import android.os.* import android.provider.MediaStore import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import com.ailiwean.core.Config.* diff --git a/module_camera/src/main/java/com/ailiwean/core/zxing/CustomMultiFormatReader.java b/module_camera/src/main/java/com/ailiwean/core/zxing/CustomMultiFormatReader.java index 4d0af06..83cb5e5 100644 --- a/module_camera/src/main/java/com/ailiwean/core/zxing/CustomMultiFormatReader.java +++ b/module_camera/src/main/java/com/ailiwean/core/zxing/CustomMultiFormatReader.java @@ -1,7 +1,5 @@ package com.ailiwean.core.zxing; -import android.util.Log; - import com.ailiwean.core.Config; import com.ailiwean.core.zxing.core.BarcodeFormat; import com.ailiwean.core.zxing.core.BinaryBitmap; @@ -11,7 +9,6 @@ import com.ailiwean.core.zxing.core.ReaderException; import com.ailiwean.core.zxing.core.Result; import com.ailiwean.core.zxing.core.aztec.AztecReader; -import com.ailiwean.core.zxing.core.common.HybridBinarizer; import com.ailiwean.core.zxing.core.common.HybridBinarizerCrude; import com.ailiwean.core.zxing.core.common.HybridBinarizerFine; import com.ailiwean.core.zxing.core.datamatrix.DataMatrixReader; @@ -21,7 +18,6 @@ import com.ailiwean.core.zxing.core.pdf417.PDF417Reader; import com.ailiwean.core.zxing.core.qrcode.QRCodeReader; - import java.util.ArrayList; import java.util.Collection; import java.util.Map; @@ -164,10 +160,14 @@ private Result decodeInternal(BinaryBitmap image) { if (readers != null) { for (Reader reader : readers) { try { - if (!(image.getBinarizer() instanceof HybridBinarizerFine) && - reader instanceof OneDReader) - continue; - return reader.decode(image, hints); + + if (!(reader instanceof OneDReader)) + return reader.decode(image, hints); + + if (image.getBinarizer() instanceof HybridBinarizerFine || + image.getBinarizer() instanceof HybridBinarizerCrude) + return reader.decode(image, hints); + } catch (ReaderException re) { // continue } catch (Exception ignored) { diff --git a/module_camera/src/main/java/com/ailiwean/core/zxing/ScanRect.java b/module_camera/src/main/java/com/ailiwean/core/zxing/ScanRect.java index 8d83184..42d46b1 100644 --- a/module_camera/src/main/java/com/ailiwean/core/zxing/ScanRect.java +++ b/module_camera/src/main/java/com/ailiwean/core/zxing/ScanRect.java @@ -3,6 +3,9 @@ import android.graphics.Rect; import android.graphics.RectF; +import com.ailiwean.core.Config; +import com.ailiwean.core.helper.ScanHelper; + /** * @Package: com.ailiwean.core.zxing * @ClassName: ScanRect @@ -31,8 +34,20 @@ public class ScanRect { * @param r */ public void setRect(RectF r) { + //默认适配的是90度,也就是手机垂直方向拿着 + //朝左倾斜90 + if (Config.is90() && r != null) { + r = ScanHelper.adapter90(r); + } + //朝右倾斜90 + if (Config.is270() && r != null) { + r = ScanHelper.adapter270(r); + } + this.r = r; + scanR = null; + scanRR = null; } /*** diff --git a/module_camera/src/main/java/com/ailiwean/core/zxing/core/PlanarYUVLuminanceSource.java b/module_camera/src/main/java/com/ailiwean/core/zxing/core/PlanarYUVLuminanceSource.java index 89f8f33..060c63c 100644 --- a/module_camera/src/main/java/com/ailiwean/core/zxing/core/PlanarYUVLuminanceSource.java +++ b/module_camera/src/main/java/com/ailiwean/core/zxing/core/PlanarYUVLuminanceSource.java @@ -16,9 +16,6 @@ package com.ailiwean.core.zxing.core; -import android.util.Log; - -import com.ailiwean.core.zxing.core.common.GlobalHistogramBinarizer; import com.ailiwean.core.zxing.core.common.HybridBinarizer; import com.ailiwean.core.zxing.core.common.HybridBinarizerCrude; import com.ailiwean.core.zxing.core.common.HybridBinarizerFine; diff --git a/module_camera/src/main/java/com/ailiwean/core/zxing/core/common/HybridBinarizerCrude.java b/module_camera/src/main/java/com/ailiwean/core/zxing/core/common/HybridBinarizerCrude.java index d0f57c5..fbbf09e 100644 --- a/module_camera/src/main/java/com/ailiwean/core/zxing/core/common/HybridBinarizerCrude.java +++ b/module_camera/src/main/java/com/ailiwean/core/zxing/core/common/HybridBinarizerCrude.java @@ -90,11 +90,10 @@ protected BitMatrix creatBitMatrix() throws NotFoundException { BitMatrix newMatrix = new BitMatrix(width, height); calculateThresholdForBlock(luminances, subWidth, subHeight, width, height, blackPoints, newMatrix); matrix = newMatrix; + return matrix; } else { - // If the image is too small, fall back to the global histogram approach. - matrix = super.getBlackMatrix(); + return null; } - return matrix; } @Override diff --git a/module_camera/src/main/java/com/ailiwean/core/zxing/core/oned/OneDReader.java b/module_camera/src/main/java/com/ailiwean/core/zxing/core/oned/OneDReader.java index 2fbbed4..85fea07 100644 --- a/module_camera/src/main/java/com/ailiwean/core/zxing/core/oned/OneDReader.java +++ b/module_camera/src/main/java/com/ailiwean/core/zxing/core/oned/OneDReader.java @@ -182,7 +182,7 @@ private Result doDecode(BinaryBitmap image, hitCount = 0; } lastResult = currentResult; - if (hitCount >= Math.min(15, image.getHeight() >> 6)) + if (hitCount > 2) return lastResult; } diff --git a/module_camera/src/main/java/com/google/android/cameraview/BaseCameraView.kt b/module_camera/src/main/java/com/google/android/cameraview/BaseCameraView.kt index 32676b9..f4b00cf 100644 --- a/module_camera/src/main/java/com/google/android/cameraview/BaseCameraView.kt +++ b/module_camera/src/main/java/com/google/android/cameraview/BaseCameraView.kt @@ -8,7 +8,6 @@ import android.os.Build import android.os.Handler import android.os.HandlerThread import android.util.AttributeSet -import androidx.annotation.FloatRange import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager @@ -173,6 +172,7 @@ abstract class BaseCameraView @JvmOverloads constructor(context: Context, attrib } protected fun onCameraPause() { + closeCameraBefore() closeCamera() isShoudCreateOpen = false } diff --git a/module_camera/src/main/java/com/google/android/cameraview/CameraView.java b/module_camera/src/main/java/com/google/android/cameraview/CameraView.java index be04619..c952ae6 100644 --- a/module_camera/src/main/java/com/google/android/cameraview/CameraView.java +++ b/module_camera/src/main/java/com/google/android/cameraview/CameraView.java @@ -18,6 +18,7 @@ import android.app.Activity; import android.content.Context; +import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.PointF; import android.graphics.RectF; @@ -27,6 +28,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.FrameLayout; @@ -104,7 +106,7 @@ public class CameraView extends FrameLayout { private boolean mAdjustViewBounds; - private final DisplayOrientationDetector mDisplayOrientationDetector; + protected final DisplayOrientationDetector mDisplayOrientationDetector; public CameraView(Context context) { this(context, null); @@ -129,6 +131,7 @@ public CameraView(Context context, AttributeSet attrs, int defStyleAttr) { } else { mImpl = new Camera2(mCallbacks, context); } +// mImpl = new Camera1(mCallbacks); // Attributes TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CameraView, defStyleAttr, R.style.Widget_CameraView); @@ -175,8 +178,6 @@ protected void onDetachedFromWindow() { super.onDetachedFromWindow(); } - RectF r = new RectF(); - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (isInEditMode()) { @@ -190,7 +191,9 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = getMeasuredWidth(); int height = getMeasuredHeight(); AspectRatio ratio = getAspectRatio(); - if (mDisplayOrientationDetector.getLastKnownDisplayOrientation() % 180 == 0) { + if (getContext().getResources().getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT) { + Config.displayOrientation = 0; ratio = ratio.inverse(); } assert ratio != null; @@ -220,6 +223,8 @@ protected void defineScanParseRect(View view) { if (view == null) return; + RectF r = new RectF(); + Config.scanRect.setScanR(null); Config.scanRect.setScanRR(null); Config.scanRect.setRect(null); @@ -228,8 +233,13 @@ protected void defineScanParseRect(View view) { int oriWidth = getMeasuredWidth(); AspectRatio ratio = getAspectRatio(); - if (mDisplayOrientationDetector.getLastKnownDisplayOrientation() % 180 == 0) { + if (getContext().getResources().getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT) { + Config.displayOrientation = 0; ratio = ratio.inverse(); + } else { + if (mDisplayOrientationDetector.getLastKnownDisplayOrientation() != 0) + Config.displayOrientation = mDisplayOrientationDetector.getLastKnownDisplayOrientation(); } if (ratio == null) @@ -347,6 +357,10 @@ public void openCameraBefore() { initPreView(); } + public void closeCameraBefore() { + } + + /** * Open a camera device and start showing camera preview. This is typically called from */ diff --git a/module_camera/src/main/java/com/google/android/cameraview/DisplayOrientationDetector.java b/module_camera/src/main/java/com/google/android/cameraview/DisplayOrientationDetector.java index 14f5168..c989890 100644 --- a/module_camera/src/main/java/com/google/android/cameraview/DisplayOrientationDetector.java +++ b/module_camera/src/main/java/com/google/android/cameraview/DisplayOrientationDetector.java @@ -17,6 +17,7 @@ package com.google.android.cameraview; import android.content.Context; +import android.util.Log; import android.util.SparseIntArray; import android.view.Display; import android.view.OrientationEventListener; @@ -30,7 +31,9 @@ abstract class DisplayOrientationDetector { private final OrientationEventListener mOrientationEventListener; - /** Mapping from Surface.Rotation_n to degrees. */ + /** + * Mapping from Surface.Rotation_n to degrees. + */ static final SparseIntArray DISPLAY_ORIENTATIONS = new SparseIntArray(); static { @@ -86,11 +89,27 @@ void dispatchOnDisplayOrientationChanged(int displayOrientation) { onDisplayOrientationChanged(displayOrientation); } + public boolean isVertical() { + return mLastKnownDisplayOrientation % 180 != 0; + } + + public boolean isHorizontal() { + return mLastKnownDisplayOrientation % 180 == 0; + } + /** * Called when display orientation is changed. * * @param displayOrientation One of 0, 90, 180, and 270. */ + + public abstract void onDisplayOrientationChanged(int displayOrientation); + private boolean isVisiable = true; + + public void isVisiable(boolean isVisiable) { + this.isVisiable = isVisiable; + } + } diff --git a/module_camera/src/main/res/layout-land/nbzxing_default_floorview.xml b/module_camera/src/main/res/layout-land/nbzxing_default_floorview.xml new file mode 100644 index 0000000..9ae90ce --- /dev/null +++ b/module_camera/src/main/res/layout-land/nbzxing_default_floorview.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_camera/src/main/res/layout/nbzxing_default_floorview.xml b/module_camera/src/main/res/layout/nbzxing_default_floorview.xml index 889bf51..484dc1e 100644 --- a/module_camera/src/main/res/layout/nbzxing_default_floorview.xml +++ b/module_camera/src/main/res/layout/nbzxing_default_floorview.xml @@ -19,13 +19,6 @@ android:layout_height="400dp" android:layout_marginTop="70dp" /> - - + + \ No newline at end of file diff --git a/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverBrightScale.java b/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverBrightScale.java index 8ad4640..548be6a 100644 --- a/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverBrightScale.java +++ b/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverBrightScale.java @@ -1,7 +1,6 @@ package com.ailiwean.module_grayscale; import android.graphics.Rect; -import android.util.Log; /** * @Package: com.ailiwean.module_grayscale diff --git a/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverDarkScale.java b/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverDarkScale.java index 4c7d6c0..4c4b63c 100644 --- a/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverDarkScale.java +++ b/module_grayscale/src/main/java/com/ailiwean/module_grayscale/OverDarkScale.java @@ -1,7 +1,6 @@ package com.ailiwean.module_grayscale; import android.graphics.Rect; -import android.util.Log; /** * @Package: com.ailiwean.module_grayscale