diff --git a/README.md b/README.md
index 3b655bc..7cfc830 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
[](https://jitpack.io/#jenly1314/ZXingLite)
[](https://travis-ci.org/jenly1314/ZXingLite)
[](https://circleci.com/gh/jenly1314/ZXingLite)
-[](https://android-arsenal.com/api?level=16)
+[](https://android-arsenal.com/api?level=21)
[](http://www.apache.org/licenses/LICENSE-2.0)
[](https://jenly1314.github.io/)
[](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"