diff --git a/README.md b/README.md index 3b655bc..7cfc830 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![JitPack](https://jitpack.io/v/jenly1314/ZXingLite.svg)](https://jitpack.io/#jenly1314/ZXingLite) [![CI](https://travis-ci.org/jenly1314/ZXingLite.svg?branch=master)](https://travis-ci.org/jenly1314/ZXingLite) [![CircleCI](https://circleci.com/gh/jenly1314/ZXingLite.svg?style=svg)](https://circleci.com/gh/jenly1314/ZXingLite) -[![API](https://img.shields.io/badge/API-16%2B-blue.svg?style=flat)](https://android-arsenal.com/api?level=16) +[![API](https://img.shields.io/badge/API-21%2B-blue.svg?style=flat)](https://android-arsenal.com/api?level=21) [![License](https://img.shields.io/badge/license-Apche%202.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) [![Blog](https://img.shields.io/badge/blog-Jenly-9933CC.svg)](https://jenly1314.github.io/) [![QQGroup](https://img.shields.io/badge/QQGroup-20867961-blue.svg)](http://shang.qq.com/wpa/qunwpa?idkey=8fcc6a2f88552ea44b1.1.982c94fd124f7bb3ec227e2a400dbbfaad3dc2f5ad) @@ -44,7 +44,7 @@ ZXingLite for Android 是ZXing的精简版,基于ZXing库优化扫码和生成 | scannerLineMoveDistance | dimension | 2dp | 扫描线每次移动距离 | | scannerLineHeight | dimension | 5dp | 扫描线高度 | | frameLineWidth | dimension | 1dp | 边框线宽度 | -| scannerAnimationDelay | integer | 15 | 扫描动画延迟间隔时间,单位:毫秒 | +| scannerAnimationDelay | integer | 20 | 扫描动画延迟间隔时间,单位:毫秒 | | frameRatio | float | 0.625f | 扫码框与屏幕占比 | @@ -74,10 +74,11 @@ implementation 'com.king.zxing:zxing-lite:1.1.9' ``` -###### 如果Gradle出现compile失败的情况,可以在Project的build.gradle里面添加如下:(也可以使用上面的GitPack来complie) +###### 如果Gradle出现compile失败的情况,可以在Project的build.gradle里面添加如下:(也可以使用上面的JitPack来compile) ```gradle allprojects { repositories { + //... maven { url 'https://dl.bintray.com/jenly/maven' } } } @@ -165,6 +166,17 @@ api 'com.google.zxing:core:3.3.3' > 4、参照CaptureHelper写一个自定义的扫码帮助类,其它步骤同方式3。(扩展高级用法,谨慎使用) +### 其他 + +需使用JDK8+编译,在你项目中的build.gradle的android{}中添加配置: + +```gradle +compileOptions { + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 +} + +``` 更多使用详情,请查看[app](app)中的源码使用示例或直接查看[API帮助文档](https://jenly1314.github.io/projects/ZXingLite/doc/) @@ -254,9 +266,11 @@ api 'com.google.zxing:core:3.3.3' CNBlogs: jenly - Github: jenly1314 + GitHub: jenly1314 - 加入QQ群: 20867961 + Gitee: jenly1314 + + 加入QQ群: 20867961
diff --git a/app/src/main/java/com/king/zxing/app/CustomActivity.java b/app/src/main/java/com/king/zxing/app/CustomActivity.java index 1547be2..3cd2059 100644 --- a/app/src/main/java/com/king/zxing/app/CustomActivity.java +++ b/app/src/main/java/com/king/zxing/app/CustomActivity.java @@ -8,6 +8,7 @@ import android.view.View; import android.widget.TextView; import android.widget.Toast; +import com.google.zxing.Result; import com.king.zxing.CaptureHelper; import com.king.zxing.OnCaptureCallback; import com.king.zxing.ViewfinderView; @@ -34,6 +35,7 @@ public class CustomActivity extends AppCompatActivity implements OnCaptureCallba private View ivTorch; + private Toast toast; @Override public void onCreate(Bundle icicle) { @@ -100,13 +102,23 @@ public class CustomActivity extends AppCompatActivity implements OnCaptureCallba * @return */ @Override - public boolean onResultCallback(String result) { + public boolean onResultCallback(Result result) { if(isContinuousScan){ - Toast.makeText(this,result,Toast.LENGTH_SHORT).show(); + showToast(result.getText()); } return false; } + private void showToast(String text){ + if(toast == null){ + toast = Toast.makeText(this,text,Toast.LENGTH_SHORT); + }else{ + toast.setDuration(Toast.LENGTH_SHORT); + toast.setText(text); + } + toast.show(); + } + public void onClick(View v){ diff --git a/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java b/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java index bc4471a..c606ee2 100644 --- a/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java +++ b/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java @@ -20,9 +20,10 @@ import android.view.View; import android.widget.TextView; import android.widget.Toast; +import com.google.zxing.Result; import com.king.zxing.CaptureActivity; import com.king.zxing.app.util.StatusBarUtils; -import com.king.zxing.camera.FrontLightMode; + import androidx.appcompat.widget.Toolbar; @@ -33,6 +34,9 @@ import androidx.appcompat.widget.Toolbar; public class CustomCaptureActivity extends CaptureActivity { private boolean isContinuousScan; + + private Toast toast; + @Override public int getLayoutId() { return R.layout.custom_capture_activity; @@ -51,12 +55,12 @@ public class CustomCaptureActivity extends CaptureActivity { //获取CaptureHelper,里面有扫码相关的配置设置 getCaptureHelper().playBeep(false)//播放音效 .vibrate(true)//震动 + .fullScreenScan(true) .supportVerticalCode(true)//支持扫垂直条码,建议有此需求时才使用。 // .decodeFormats(DecodeFormatManager.QR_CODE_FORMATS)//设置只识别二维码会提升速度 // .framingRectRatio(0.9f)//设置识别区域比例,范围建议在0.625 ~ 1.0之间。非全屏识别时才有效 // .framingRectVerticalOffset(0)//设置识别区域垂直方向偏移量,非全屏识别时才有效 // .framingRectHorizontalOffset(0)//设置识别区域水平方向偏移量,非全屏识别时才有效 - .frontLightMode(FrontLightMode.AUTO)//设置闪光灯模式 .tooDarkLux(45f)//设置光线太暗时,自动触发开启闪光灯的照度值 .brightEnoughLux(100f)//设置光线足够明亮时,自动触发关闭闪光灯的照度值 .continuousScan(isContinuousScan)//是否连扫 @@ -70,14 +74,24 @@ public class CustomCaptureActivity extends CaptureActivity { * @return */ @Override - public boolean onResultCallback(String result) { + public boolean onResultCallback(Result result) { if(isContinuousScan){//连续扫码时,直接弹出结果 - Toast.makeText(this,result,Toast.LENGTH_SHORT).show(); + showToast(result.getText()); } return super.onResultCallback(result); } + private void showToast(String text){ + if(toast == null){ + toast = Toast.makeText(this,text,Toast.LENGTH_SHORT); + }else{ + toast.setDuration(Toast.LENGTH_SHORT); + toast.setText(text); + } + toast.show(); + } + public void onClick(View v){ switch (v.getId()){ case R.id.ivLeft: diff --git a/app/src/main/java/com/king/zxing/app/MainActivity.java b/app/src/main/java/com/king/zxing/app/MainActivity.java index e6b4b62..f6cb14c 100644 --- a/app/src/main/java/com/king/zxing/app/MainActivity.java +++ b/app/src/main/java/com/king/zxing/app/MainActivity.java @@ -31,6 +31,8 @@ import com.king.zxing.Intents; import com.king.zxing.app.util.UriUtils; import com.king.zxing.util.CodeUtils; +import org.w3c.dom.Text; + import java.util.List; import androidx.appcompat.app.AppCompatActivity; @@ -70,6 +72,8 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P private String title; private boolean isContinuousScan; + private Toast toast; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -83,7 +87,7 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P switch (requestCode){ case REQUEST_CODE_SCAN: String result = data.getStringExtra(Intents.Scan.RESULT); - Toast.makeText(this,result,Toast.LENGTH_SHORT).show(); + showToast(result); break; case REQUEST_CODE_PHOTO: parsePhoto(data); @@ -93,6 +97,16 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P } } + private void showToast(String text){ + if(toast == null){ + toast = Toast.makeText(this,text,Toast.LENGTH_SHORT); + }else{ + toast.setDuration(Toast.LENGTH_SHORT); + toast.setText(text); + } + toast.show(); + } + private void parsePhoto(Intent data){ final String path = UriUtils.getImagePath(this,data); Log.d("Jenly","path:" + path); diff --git a/app/src/main/res/layout/custom_capture_activity.xml b/app/src/main/res/layout/custom_capture_activity.xml index 76a6066..77bd0a9 100644 --- a/app/src/main/res/layout/custom_capture_activity.xml +++ b/app/src/main/res/layout/custom_capture_activity.xml @@ -20,7 +20,8 @@ app:cornerColor="@color/colorPrimary" app:resultPointColor="@color/colorAccent" app:labelTextLocation="bottom" - app:laserStyle="grid"/> + app:laserStyle="grid" + app:showResultPoint="true"/> { //如果设置了回调,并且onCallback返回为true,则表示拦截 - if(onCaptureCallback!=null && onCaptureCallback.onResultCallback(text)){ + if(onCaptureCallback!=null && onCaptureCallback.onResultCallback(result)){ return; } Intent intent = new Intent(); @@ -541,7 +550,7 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture } //如果设置了回调,并且onCallback返回为true,则表示拦截 - if(onCaptureCallback!=null && onCaptureCallback.onResultCallback(text)){ + if(onCaptureCallback!=null && onCaptureCallback.onResultCallback(result)){ return; } Intent intent = new Intent(); @@ -662,23 +671,6 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture return this; } - /** - * 设置闪光灯模式。当设置模式为:{@link FrontLightMode#AUTO}时,如果满意默认的照度值范围, - * 可通过{@link #tooDarkLux(float)}和{@link #brightEnoughLux(float)}来自定义照度范围, - * 控制自动触发开启和关闭闪光灯。 - * 当设置模式非{@link FrontLightMode#AUTO}时,传感器不会检测,则不使用手电筒 - * - * @param mode 默认:{@link FrontLightMode#AUTO} - * @return - */ - public CaptureHelper frontLightMode(FrontLightMode mode) { - FrontLightMode.put(activity,mode); - if(ivTorch!=null && mode != FrontLightMode.AUTO){ - ivTorch.setVisibility(View.INVISIBLE); - } - return this; - } - /** * 设置光线太暗时,自动显示手电筒按钮 * @param tooDarkLux 默认:{@link AmbientLightManager#TOO_DARK_LUX} @@ -798,6 +790,16 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture return this; } + /** + * 是否启用光线传感器 + * @param isAmbientLightEnabled + * @return + */ + public CaptureHelper ambientLightEnabled(boolean isAmbientLightEnabled){ + this.isAmbientLightEnabled = isAmbientLightEnabled; + return this; + } + /** * 设置扫码回调 diff --git a/lib/src/main/java/com/king/zxing/DecodeHandler.java b/lib/src/main/java/com/king/zxing/DecodeHandler.java index 9659185..cf43606 100644 --- a/lib/src/main/java/com/king/zxing/DecodeHandler.java +++ b/lib/src/main/java/com/king/zxing/DecodeHandler.java @@ -27,7 +27,6 @@ import android.os.Message; import android.view.Display; import android.view.WindowManager; -import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.MultiFormatReader; @@ -148,16 +147,22 @@ final class DecodeHandler extends Handler { long end = System.currentTimeMillis(); LogUtils.d("Found barcode in " + (end - start) + " ms"); - BarcodeFormat barcodeFormat = rawResult.getBarcodeFormat(); - if(handler!=null && handler.isSupportAutoZoom() && barcodeFormat == BarcodeFormat.QR_CODE){ - + if(handler.isSupportAutoZoom()){//是否支持自动放大 ResultPoint[] resultPoints = rawResult.getResultPoints(); - if(resultPoints.length >= 3){ - float distance1 = ResultPoint.distance(resultPoints[0],resultPoints[1]); - float distance2 = ResultPoint.distance(resultPoints[1],resultPoints[2]); - float distance3 = ResultPoint.distance(resultPoints[0],resultPoints[2]); - int maxDistance = (int)Math.max(Math.max(distance1,distance2),distance3); - if(handleAutoZoom(maxDistance,width)){ + LogUtils.d("resultPoints:" +resultPoints.length); + + final int length = resultPoints.length; + if(length >= 2){//超过两个点则计算距离 + int ratio = 6; + int maxDistance = (int)ResultPoint.distance(resultPoints[0],resultPoints[1]); + if(length >= 3){ + float distance2 = ResultPoint.distance(resultPoints[1],resultPoints[2]); + float distance3 = ResultPoint.distance(resultPoints[0],resultPoints[2]); + maxDistance = (int)Math.max(Math.max(maxDistance,distance2),distance3); + ratio = 5; + } + + if(handleAutoZoom(maxDistance,width,ratio)){//根据点之间的最大距离 Message message = Message.obtain(); message.what = R.id.decode_succeeded; message.obj = rawResult; @@ -170,23 +175,19 @@ final class DecodeHandler extends Handler { return; } } - } - if (handler != null) { - Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult); - if(handler.isReturnBitmap()){ - Bundle bundle = new Bundle(); - bundleThumbnail(source, bundle); - message.setData(bundle); - } - message.sendToTarget(); + Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult); + if(handler.isReturnBitmap()){ + Bundle bundle = new Bundle(); + bundleThumbnail(source, bundle); + message.setData(bundle); } + message.sendToTarget(); + } else { - if (handler != null) { - Message message = Message.obtain(handler, R.id.decode_failed); - message.sendToTarget(); - } + Message message = Message.obtain(handler, R.id.decode_failed); + message.sendToTarget(); } } @@ -219,12 +220,12 @@ final class DecodeHandler extends Handler { bundle.putFloat(DecodeThread.BARCODE_SCALED_FACTOR, (float) width / source.getWidth()); } - private boolean handleAutoZoom(int length,int width){ + private boolean handleAutoZoom(int length,int width,int ratio){ if(lastZoomTime > System.currentTimeMillis() - 1000){ - return true; + return false; } - if(length < width/ 5){ + if(length < width / ratio){ Camera camera = cameraManager.getOpenCamera().getCamera(); if(camera!=null){ diff --git a/lib/src/main/java/com/king/zxing/InactivityTimer.java b/lib/src/main/java/com/king/zxing/InactivityTimer.java index 3664b5c..45a505a 100644 --- a/lib/src/main/java/com/king/zxing/InactivityTimer.java +++ b/lib/src/main/java/com/king/zxing/InactivityTimer.java @@ -35,8 +35,6 @@ import java.util.concurrent.RejectedExecutionException; */ final class InactivityTimer { - private static final String TAG = InactivityTimer.class.getSimpleName(); - private static final long INACTIVITY_DELAY_MS = 5 * 60 * 1000L; private final Activity activity; @@ -106,7 +104,7 @@ final class InactivityTimer { // 0 indicates that we're on battery InactivityTimer inactivityTimer = weakReference.get(); - if(inactivityTimer!=null){ + if(inactivityTimer != null){ boolean onBatteryNow = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) <= 0; if (onBatteryNow) { inactivityTimer.onActivity(); diff --git a/lib/src/main/java/com/king/zxing/OnCaptureCallback.java b/lib/src/main/java/com/king/zxing/OnCaptureCallback.java index a0004ad..2f74b43 100644 --- a/lib/src/main/java/com/king/zxing/OnCaptureCallback.java +++ b/lib/src/main/java/com/king/zxing/OnCaptureCallback.java @@ -1,6 +1,7 @@ package com.king.zxing; +import com.google.zxing.Result; /** * @author Jenly @@ -12,5 +13,5 @@ public interface OnCaptureCallback { * @param result 扫码结果 * @return 返回true表示拦截,将不自动执行后续逻辑,为false表示不拦截 */ - boolean onResultCallback(String result); + boolean onResultCallback(Result result); } diff --git a/lib/src/main/java/com/king/zxing/ViewfinderView.java b/lib/src/main/java/com/king/zxing/ViewfinderView.java index dccce11..0c914a5 100644 --- a/lib/src/main/java/com/king/zxing/ViewfinderView.java +++ b/lib/src/main/java/com/king/zxing/ViewfinderView.java @@ -52,7 +52,7 @@ public final class ViewfinderView extends View { private static final int CURRENT_POINT_OPACITY = 0xA0; private static final int MAX_RESULT_POINTS = 20; - private static final int POINT_SIZE = 20; + private static final int POINT_SIZE = 30; /** * 画笔 @@ -176,7 +176,7 @@ public final class ViewfinderView extends View { private int frameLineWidth; /** - * 扫描动画延迟间隔时间 默认15毫秒 + * 扫描动画延迟间隔时间 默认20毫秒 */ private int scannerAnimationDelay; @@ -274,7 +274,7 @@ public final class ViewfinderView extends View { scannerLineMoveDistance = (int)array.getDimension(R.styleable.ViewfinderView_scannerLineMoveDistance,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,2,getResources().getDisplayMetrics())); scannerLineHeight = (int)array.getDimension(R.styleable.ViewfinderView_scannerLineHeight,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,5,getResources().getDisplayMetrics())); frameLineWidth = (int)array.getDimension(R.styleable.ViewfinderView_frameLineWidth,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())); - scannerAnimationDelay = array.getInteger(R.styleable.ViewfinderView_scannerAnimationDelay,15); + scannerAnimationDelay = array.getInteger(R.styleable.ViewfinderView_scannerAnimationDelay,20); frameRatio = array.getFloat(R.styleable.ViewfinderView_frameRatio,0.625f); array.recycle(); diff --git a/lib/src/main/java/com/king/zxing/camera/CameraConfigurationManager.java b/lib/src/main/java/com/king/zxing/camera/CameraConfigurationManager.java index d1c2497..0460b95 100644 --- a/lib/src/main/java/com/king/zxing/camera/CameraConfigurationManager.java +++ b/lib/src/main/java/com/king/zxing/camera/CameraConfigurationManager.java @@ -42,7 +42,6 @@ final class CameraConfigurationManager { private int cwNeededRotation; private int cwRotationFromDisplayToCamera; private Point screenResolution; - private Point cameraResolution; private Point bestPreviewSize; private Point previewSizeOnScreen; @@ -81,6 +80,7 @@ final class CameraConfigurationManager { throw new IllegalArgumentException("Bad rotation: " + displayRotation); } } + LogUtils.i("Display at: " + cwRotationFromNaturalToDisplay); int cwRotationFromNaturalToCamera = camera.getOrientation(); @@ -92,19 +92,6 @@ final class CameraConfigurationManager { LogUtils.i("Front camera overriden to: " + cwRotationFromNaturalToCamera); } - /* - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - String overrideRotationString; - if (camera.getFacing() == CameraFacing.FRONT) { - overrideRotationString = prefs.getString(PreferencesActivity.KEY_FORCE_CAMERA_ORIENTATION_FRONT, null); - } else { - overrideRotationString = prefs.getString(PreferencesActivity.KEY_FORCE_CAMERA_ORIENTATION, null); - } - if (overrideRotationString != null && !"-".equals(overrideRotationString)) { - LogUtils.i("Overriding camera manually to " + overrideRotationString); - cwRotationFromNaturalToCamera = Integer.parseInt(overrideRotationString); - } - */ cwRotationFromDisplayToCamera = (360 + cwRotationFromNaturalToCamera - cwRotationFromNaturalToDisplay) % 360; LogUtils.i("Final display orientation: " + cwRotationFromDisplayToCamera); @@ -116,32 +103,26 @@ final class CameraConfigurationManager { } LogUtils.i("Clockwise rotation from display to camera: " + cwNeededRotation); - Point theScreenResolution = new Point(); - display.getSize(theScreenResolution); - screenResolution = theScreenResolution; + screenResolution = new Point(); + display.getSize(screenResolution); LogUtils.i("Screen resolution in current orientation: " + screenResolution); - - cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution); - LogUtils.i("Camera resolution: " + cameraResolution); bestPreviewSize = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution); LogUtils.i("Best available preview size: " + bestPreviewSize); boolean isScreenPortrait = screenResolution.x < screenResolution.y; - boolean isPreviewSizePortrait = bestPreviewSize.x < bestPreviewSize.y; - - if (isScreenPortrait == isPreviewSizePortrait) { - previewSizeOnScreen = bestPreviewSize; - } else { + if (isScreenPortrait) { previewSizeOnScreen = new Point(bestPreviewSize.y, bestPreviewSize.x); + } else { + previewSizeOnScreen = bestPreviewSize; } LogUtils.i("Preview size on screen: " + previewSizeOnScreen); + } void setDesiredCameraParameters(OpenCamera camera, boolean safeMode) { Camera theCamera = camera.getCamera(); Camera.Parameters parameters = theCamera.getParameters(); - if (parameters == null) { LogUtils.w("Device error: no camera parameters are available. Proceeding without configuration."); return; @@ -159,7 +140,7 @@ final class CameraConfigurationManager { parameters.setZoom(parameters.getMaxZoom() / 10); } - initializeTorch(parameters, prefs, safeMode); +// initializeTorch(parameters, prefs, safeMode); CameraConfigurationUtils.setFocus( parameters, @@ -189,9 +170,9 @@ final class CameraConfigurationManager { } parameters.setPreviewSize(bestPreviewSize.x, bestPreviewSize.y); - + parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); theCamera.setParameters(parameters); - + theCamera.cancelAutoFocus(); theCamera.setDisplayOrientation(cwRotationFromDisplayToCamera); Camera.Parameters afterParameters = theCamera.getParameters(); @@ -202,6 +183,7 @@ final class CameraConfigurationManager { bestPreviewSize.x = afterSize.width; bestPreviewSize.y = afterSize.height; } + } Point getBestPreviewSize() { @@ -212,10 +194,6 @@ final class CameraConfigurationManager { return previewSizeOnScreen; } - Point getCameraResolution() { - return cameraResolution; - } - Point getScreenResolution() { return screenResolution; } @@ -243,17 +221,16 @@ final class CameraConfigurationManager { camera.setParameters(parameters); } - private void initializeTorch(Camera.Parameters parameters, SharedPreferences prefs, boolean safeMode) { - boolean currentSetting = FrontLightMode.readPref(prefs) == FrontLightMode.ON; - doSetTorch(parameters, currentSetting, safeMode); + private void initializeTorch(Camera.Parameters parameters, boolean safeMode) { + doSetTorch(parameters, false, safeMode); } private void doSetTorch(Camera.Parameters parameters, boolean newSetting, boolean safeMode) { CameraConfigurationUtils.setTorch(parameters, newSetting); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - if (!safeMode && !prefs.getBoolean(Preferences.KEY_DISABLE_EXPOSURE, true)) { - CameraConfigurationUtils.setBestExposure(parameters, newSetting); - } +// SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); +// if (!safeMode && !prefs.getBoolean(Preferences.KEY_DISABLE_EXPOSURE, true)) { +// CameraConfigurationUtils.setBestExposure(parameters, newSetting); +// } } } \ No newline at end of file diff --git a/lib/src/main/java/com/king/zxing/camera/CameraConfigurationUtils.java b/lib/src/main/java/com/king/zxing/camera/CameraConfigurationUtils.java index 7f9a7b1..7b625ea 100644 --- a/lib/src/main/java/com/king/zxing/camera/CameraConfigurationUtils.java +++ b/lib/src/main/java/com/king/zxing/camera/CameraConfigurationUtils.java @@ -26,6 +26,7 @@ import com.king.zxing.util.LogUtils; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; @@ -269,89 +270,56 @@ public final class CameraConfigurationUtils { } } + + /** + * 预览尺寸与给定的宽高尺寸比较器。首先比较宽高的比例,在宽高比相同的情况下,根据宽和高的最小差进行比较。 + */ + private static class SizeComparator implements Comparator { + private final int width; + private final int height; + private final float ratio; + SizeComparator(int width, int height) { + //不管横屏还是竖屏,parameters.getSupportedPreviewSizes()的size.width 始终大于或等于 size.height + if (width < height) { + this.width = height; + this.height = width; + } else { + this.width = width; + this.height = height; + } + this.ratio = (float) this.height / this.width; + } + + @Override + public int compare(Camera.Size size1, Camera.Size size2) { + int width1 = size1.width; + int height1 = size1.height; + int width2 = size2.width; + int height2 = size2.height; + float ratio1 = Math.abs((float) height1 / width1 - ratio); + float ratio2 = Math.abs((float) height2 / width2 - ratio); + int result = Float.compare(ratio1, ratio2); + if (result != 0) { + return result; + } else { + int minGap1 = Math.abs(width - width1) + Math.abs(height - height1); + int minGap2 = Math.abs(width - width2) + Math.abs(height - height2); + return minGap1 - minGap2; + } + } + } + + /** + * 在Camera支持的预览尺寸中找到最佳的预览尺寸 + * @param parameters + * @param screenResolution + * @return + */ public static Point findBestPreviewSizeValue(Camera.Parameters parameters,final Point screenResolution) { - - List rawSupportedSizes = parameters.getSupportedPreviewSizes(); - if (rawSupportedSizes == null) { - LogUtils.w( "Device returned no supported preview sizes; using default"); - Camera.Size defaultSize = parameters.getPreviewSize(); - if (defaultSize == null) { - throw new IllegalStateException("Parameters contained no preview size!"); - } - return new Point(defaultSize.width, defaultSize.height); - } - - - if (LogUtils.isShowLog()) { - StringBuilder previewSizesString = new StringBuilder(); - for (Camera.Size size : rawSupportedSizes) { - previewSizesString.append(size.width).append('x').append(size.height).append(' '); - } - LogUtils.d( "Supported preview sizes: " + previewSizesString); - } - - double screenAspectRatio; - if(screenResolution.x < screenResolution.y){ - screenAspectRatio = screenResolution.x / (double) screenResolution.y; - }else{ - screenAspectRatio = screenResolution.y / (double) screenResolution.x; - } - LogUtils.d( "screenAspectRatio: " + screenAspectRatio); - // Find a suitable size, with max resolution - int maxResolution = 0; - - Camera.Size maxResPreviewSize = null; - for (Camera.Size size : rawSupportedSizes) { - int realWidth = size.width; - int realHeight = size.height; - int resolution = realWidth * realHeight; - if (resolution < MIN_PREVIEW_PIXELS) { - continue; - } - - boolean isCandidatePortrait = realWidth < realHeight; - int maybeFlippedWidth = isCandidatePortrait ? realWidth: realHeight ; - int maybeFlippedHeight = isCandidatePortrait ? realHeight : realWidth; - LogUtils.d( String.format("maybeFlipped:%d * %d",maybeFlippedWidth,maybeFlippedHeight)); - - double aspectRatio = maybeFlippedWidth / (double) maybeFlippedHeight; - LogUtils.d( "aspectRatio: " + aspectRatio); - double distortion = Math.abs(aspectRatio - screenAspectRatio); - LogUtils.d( "distortion: " + distortion); - if (distortion > MAX_ASPECT_DISTORTION) { - continue; - } - - if (maybeFlippedWidth == screenResolution.x && maybeFlippedHeight == screenResolution.y) { - Point exactPoint = new Point(realWidth, realHeight); - LogUtils.d( "Found preview size exactly matching screen size: " + exactPoint); - return exactPoint; - } - - // Resolution is suitable; record the one with max resolution - if (resolution > maxResolution) { - maxResolution = resolution; - maxResPreviewSize = size; - } - } - - // If no exact match, use largest preview size. This was not a great idea on older devices because - // of the additional computation needed. We're likely to get here on newer Android 4+ devices, where - // the CPU is much more powerful. - if (maxResPreviewSize != null) { - Point largestSize = new Point(maxResPreviewSize.width, maxResPreviewSize.height); - LogUtils.d( "Using largest suitable preview size: " + largestSize); - return largestSize; - } - - // If there is nothing at all suitable, return current preview size - Camera.Size defaultPreview = parameters.getPreviewSize(); - if (defaultPreview == null) { - throw new IllegalStateException("Parameters contained no preview size!"); - } - Point defaultSize = new Point(defaultPreview.width, defaultPreview.height); - LogUtils.d( "No suitable preview sizes, using default: " + defaultSize); - return defaultSize; + List preList = parameters.getSupportedPreviewSizes(); + Collections.sort(preList, new SizeComparator(screenResolution.x, screenResolution.y)); + Camera.Size size = preList.get(0); + return new Point(size.width,size.height); } private static String findSettableValue(String name, diff --git a/lib/src/main/java/com/king/zxing/camera/CameraManager.java b/lib/src/main/java/com/king/zxing/camera/CameraManager.java index 6d5ca37..3eab48c 100644 --- a/lib/src/main/java/com/king/zxing/camera/CameraManager.java +++ b/lib/src/main/java/com/king/zxing/camera/CameraManager.java @@ -168,7 +168,7 @@ public final class CameraManager { if (theCamera != null && !previewing) { theCamera.getCamera().startPreview(); previewing = true; - autoFocusManager = new AutoFocusManager(context, theCamera.getCamera()); +// autoFocusManager = new AutoFocusManager(context, theCamera.getCamera()); } } @@ -204,7 +204,7 @@ public final class CameraManager { configManager.setTorch(theCamera.getCamera(), newSetting); if (wasAutoFocusManager) { autoFocusManager = new AutoFocusManager(context, theCamera.getCamera()); - autoFocusManager.start(); +// autoFocusManager.start(); } if(onTorchListener!=null){ @@ -225,6 +225,7 @@ public final class CameraManager { * @param message The what field of the message to be sent. */ public synchronized void requestPreviewFrame(Handler handler, int message) { + LogUtils.d("requestPreviewFrame"); OpenCamera theCamera = camera; if (theCamera != null && previewing) { previewCallback.setHandler(handler, message); @@ -244,7 +245,7 @@ public final class CameraManager { if (camera == null) { return null; } - Point point = configManager.getCameraResolution(); + Point point = configManager.getBestPreviewSize(); if (point == null) { // Called early, before init even finished return null; @@ -281,22 +282,17 @@ public final class CameraManager { return null; } Rect rect = new Rect(framingRect); - Point cameraResolution = configManager.getCameraResolution(); + Point preViewResolution = configManager.getPreviewSizeOnScreen(); Point screenResolution = configManager.getScreenResolution(); - if (cameraResolution == null || screenResolution == null) { + if (preViewResolution == null || screenResolution == null) { // Called early, before init even finished return null; } -// rect.left = rect.left * cameraResolution.x / screenResolution.x; -// rect.right = rect.right * cameraResolution.x / screenResolution.x; -// rect.top = rect.top * cameraResolution.y / screenResolution.y; -// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y; - - rect.left = rect.left * cameraResolution.y / screenResolution.x; - rect.right = rect.right * cameraResolution.y / screenResolution.x; - rect.top = rect.top * cameraResolution.x / screenResolution.y; - rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y; + rect.left = rect.left * preViewResolution.x / screenResolution.x; + rect.right = rect.right * preViewResolution.x / screenResolution.x; + rect.top = rect.top * preViewResolution.y / screenResolution.y; + rect.bottom = rect.bottom * preViewResolution.y / screenResolution.y; framingRectInPreview = rect; @@ -321,8 +317,12 @@ public final class CameraManager { this.framingRectHorizontalOffset = framingRectHorizontalOffset; } - public Point getCameraResolution() { - return configManager.getCameraResolution(); + public Point getBestPreviewSize(){ + return configManager.getBestPreviewSize(); + } + + public Point getPreviewSizeOnScreen() { + return configManager.getPreviewSizeOnScreen(); } public Point getScreenResolution() { diff --git a/lib/src/main/java/com/king/zxing/camera/PreviewCallback.java b/lib/src/main/java/com/king/zxing/camera/PreviewCallback.java index a115110..a3ded3f 100644 --- a/lib/src/main/java/com/king/zxing/camera/PreviewCallback.java +++ b/lib/src/main/java/com/king/zxing/camera/PreviewCallback.java @@ -44,7 +44,7 @@ final class PreviewCallback implements Camera.PreviewCallback { @Override public void onPreviewFrame(byte[] data, Camera camera) { - Point cameraResolution = configManager.getCameraResolution(); + Point cameraResolution = configManager.getBestPreviewSize(); Handler thePreviewHandler = previewHandler; if (cameraResolution != null && thePreviewHandler != null) { Message message = thePreviewHandler.obtainMessage(previewMessage, cameraResolution.x, diff --git a/lib/src/main/java/com/king/zxing/camera/open/OpenCameraInterface.java b/lib/src/main/java/com/king/zxing/camera/open/OpenCameraInterface.java index dad92f9..e6fdf8b 100644 --- a/lib/src/main/java/com/king/zxing/camera/open/OpenCameraInterface.java +++ b/lib/src/main/java/com/king/zxing/camera/open/OpenCameraInterface.java @@ -59,6 +59,7 @@ public final class OpenCameraInterface { cameraId = 0; while (cameraId < numCameras) { Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); + Camera.getCameraInfo(cameraId, cameraInfo); if (CameraFacing.values()[cameraInfo.facing] == CameraFacing.BACK) { break; diff --git a/versions.gradle b/versions.gradle index aeb7a12..f69ca05 100644 --- a/versions.gradle +++ b/versions.gradle @@ -1,7 +1,7 @@ //App def app_version = [:] -app_version.versionCode = 26 -app_version.versionName = "1.1.9-androidx" +app_version.versionCode = 27 +app_version.versionName = "2.0.0-beta1" ext.app_version = app_version //build version @@ -28,7 +28,7 @@ versions.runner = "1.2.0" versions.espresso = "3.2.0" //zxing -versions.zxing = "3.3.3" +versions.zxing = "3.4.0" versions.easypermissions = "3.0.0"