diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index cdafbc2..90eae86 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/misc.xml b/.idea/misc.xml index 99202cc..51fa3e5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,22 +5,32 @@ diff --git a/README.md b/README.md index 8a15b0b..d3e41dc 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ api 'com.google.zxing:core:3.3.3' > 4、参照CaptureHelper写一个自定义的扫码帮助类,其它步骤同方式3。(扩展高级用法,谨慎使用) -更多使用详情,请查看[app](app)中的源码使用示例 +更多使用详情,请查看[app](app)中的源码使用示例或直接查看[API帮助文档](https://jenly1314.github.io/projects/ZXingLite/doc/) ## 版本记录 diff --git a/app/release/app-release.apk b/app/release/app-release.apk index 12b36ab..bee8036 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ 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 04be6ae..3c50672 100644 --- a/app/src/main/java/com/king/zxing/app/CustomActivity.java +++ b/app/src/main/java/com/king/zxing/app/CustomActivity.java @@ -13,6 +13,7 @@ import android.widget.TextView; import android.widget.Toast; import com.king.zxing.CaptureHelper; +import com.king.zxing.DecodeFormatManager; import com.king.zxing.OnCaptureCallback; import com.king.zxing.ViewfinderView; import com.king.zxing.app.util.StatusBarUtils; 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 d4992ee..5c11a94 100644 --- a/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java +++ b/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java @@ -15,16 +15,19 @@ */ package com.king.zxing.app; +import android.content.pm.PackageManager; import android.hardware.Camera; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; +import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import com.google.zxing.Result; +import com.google.zxing.DecodeHintType; import com.king.zxing.CaptureActivity; import com.king.zxing.app.util.StatusBarUtils; +import com.king.zxing.camera.CameraConfigurationUtils; /** * 自定义继承CaptureActivity @@ -32,6 +35,8 @@ import com.king.zxing.app.util.StatusBarUtils; */ public class CustomCaptureActivity extends CaptureActivity { + private ImageView ivFlash; + private boolean isContinuousScan; @Override public int getLayoutId() { @@ -40,39 +45,46 @@ public class CustomCaptureActivity extends CaptureActivity { @Override public void onCreate(Bundle icicle) { + super.onCreate(icicle); Toolbar toolbar = findViewById(R.id.toolbar); StatusBarUtils.immersiveStatusBar(this,toolbar,0.2f); TextView tvTitle = findViewById(R.id.tvTitle); tvTitle.setText(getIntent().getStringExtra(MainActivity.KEY_TITLE)); + ivFlash = findViewById(R.id.ivFlash); + + if(!hasTorch()){ + ivFlash.setVisibility(View.GONE); + } + isContinuousScan = getIntent().getBooleanExtra(MainActivity.KEY_IS_CONTINUOUS,false); //获取CaptureHelper,里面有扫码相关的配置设置 getCaptureHelper().playBeep(false)//播放音效 .vibrate(true)//震动 +// .decodeFormats(DecodeFormatManager.QR_CODE_FORMATS)//设置只识别二维码会提升速度 .supportVerticalCode(true)//支持扫垂直条码,建议有此需求时才使用。 .continuousScan(isContinuousScan);//是否连扫 + } + + /** + * 开启或关闭闪光灯(手电筒) + * @param on {@code true}表示开启,{@code false}表示关闭 + */ + public void setTorch(boolean on){ + Camera camera = getCameraManager().getOpenCamera().getCamera(); + Camera.Parameters parameters = camera.getParameters(); + CameraConfigurationUtils.setTorch(parameters,on); + camera.setParameters(parameters); } /** - * 关闭闪光灯(手电筒) + * 检测是否支持闪光灯(手电筒) + * @return */ - private void offFlash(){ - Camera camera = getCameraManager().getOpenCamera().getCamera(); - Camera.Parameters parameters = camera.getParameters(); - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); - camera.setParameters(parameters); - } - - /** - * 开启闪光灯(手电筒) - */ - public void openFlash(){ - Camera camera = getCameraManager().getOpenCamera().getCamera(); - Camera.Parameters parameters = camera.getParameters(); - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); - camera.setParameters(parameters); + public boolean hasTorch(){ + return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); } @@ -92,14 +104,9 @@ public class CustomCaptureActivity extends CaptureActivity { private void clickFlash(View v){ - if(v.isSelected()){ - offFlash(); - v.setSelected(false); - }else{ - openFlash(); - v.setSelected(true); - } - + boolean isSelected = v.isSelected(); + setTorch(!isSelected); + v.setSelected(!isSelected); } public void onClick(View v){ diff --git a/app/src/main/java/com/king/zxing/app/EasyCaptureActivity.java b/app/src/main/java/com/king/zxing/app/EasyCaptureActivity.java index d1701d1..4487a4c 100644 --- a/app/src/main/java/com/king/zxing/app/EasyCaptureActivity.java +++ b/app/src/main/java/com/king/zxing/app/EasyCaptureActivity.java @@ -21,6 +21,7 @@ import android.view.View; import android.widget.TextView; import com.king.zxing.CaptureActivity; +import com.king.zxing.DecodeFormatManager; import com.king.zxing.app.util.StatusBarUtils; /** @@ -41,7 +42,10 @@ public class EasyCaptureActivity extends CaptureActivity { StatusBarUtils.immersiveStatusBar(this,toolbar,0.2f); TextView tvTitle = findViewById(R.id.tvTitle); tvTitle.setText(getIntent().getStringExtra(MainActivity.KEY_TITLE)); - getCaptureHelper().playBeep(true).vibrate(true); + getCaptureHelper() +// .decodeFormats(DecodeFormatManager.QR_CODE_FORMATS)//设置只识别二维码会提升速度 + .playBeep(true) + .vibrate(true); } public void onClick(View v){ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 792e528..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/lib/build.gradle b/lib/build.gradle index 2d21b3a..b2943d7 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -26,6 +26,11 @@ android { } } +//task javadoc(type: Javadoc) { +// source = android.sourceSets.main.java.srcDirs +// classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) +//} + dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') testImplementation deps.test.junit diff --git a/lib/src/main/java/com/king/zxing/CaptureHandler.java b/lib/src/main/java/com/king/zxing/CaptureHandler.java index 4b06ef3..dab16ad 100644 --- a/lib/src/main/java/com/king/zxing/CaptureHandler.java +++ b/lib/src/main/java/com/king/zxing/CaptureHandler.java @@ -58,7 +58,7 @@ public class CaptureHandler extends Handler implements ResultPointCallback { CaptureHandler(Activity activity,ViewfinderView viewfinderView,OnCaptureListener onCaptureListener, Collection decodeFormats, - Map baseHints, + Map baseHints, String characterSet, CameraManager cameraManager) { this.activity = activity; diff --git a/lib/src/main/java/com/king/zxing/CaptureHelper.java b/lib/src/main/java/com/king/zxing/CaptureHelper.java index 3aeb53a..36af639 100644 --- a/lib/src/main/java/com/king/zxing/CaptureHelper.java +++ b/lib/src/main/java/com/king/zxing/CaptureHelper.java @@ -21,7 +21,6 @@ import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.RectF; import android.hardware.Camera; -import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.MotionEvent; @@ -36,6 +35,7 @@ import com.king.zxing.camera.CameraManager; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.EnumMap; import java.util.List; import java.util.Map; @@ -63,7 +63,7 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture private SurfaceHolder.Callback callback; private Collection decodeFormats; - private Map decodeHints; + private Map decodeHints; private String characterSet; private boolean hasSurface; @@ -376,10 +376,10 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture } /** - * + * 根据范围限定值 * @param x - * @param min - * @param max + * @param min 范围最小值 + * @param max 范围最大值 * @return */ private int clamp(int x, int min, int max) { @@ -504,7 +504,7 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture /** * 设置支持的解码一/二维码格式,默认常规的码都支持 - * @param decodeFormats + * @param decodeFormats 可参见{@link DecodeFormatManager} * @return */ public CaptureHelper decodeFormats(Collection decodeFormats) { @@ -517,11 +517,25 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture * @param decodeHints * @return */ - public CaptureHelper decodeHints(Map decodeHints) { + public CaptureHelper decodeHints(Map decodeHints) { this.decodeHints = decodeHints; return this; } + /** + * {@link DecodeHintType} + * @param key {@link DecodeHintType} + * @param value {@link } + * @return + */ + public CaptureHelper decodeHint(DecodeHintType key,Object value){ + if(decodeHints == null){ + decodeHints = new EnumMap<>(DecodeHintType.class); + } + decodeHints.put(key,value); + return this; + } + /** * 设置解码时编码字符集 * @param characterSet @@ -596,21 +610,37 @@ public class CaptureHelper implements CaptureLifecycle,CaptureTouchEvent,Capture return this; } + /** + * {@link CameraManager} + * @return {@link #cameraManager} + */ @Override public CameraManager getCameraManager() { return cameraManager; } + /** + * {@link BeepManager} + * @return {@link #beepManager} + */ @Override public BeepManager getBeepManager() { return beepManager; } + /** + * {@link AmbientLightManager} + * @return {@link #ambientLightManager} + */ @Override public AmbientLightManager getAmbientLightManager() { return ambientLightManager; } + /** + * {@link InactivityTimer} + * @return {@link #inactivityTimer} + */ @Override public InactivityTimer getInactivityTimer() { return inactivityTimer; diff --git a/lib/src/main/java/com/king/zxing/DecodeHandler.java b/lib/src/main/java/com/king/zxing/DecodeHandler.java index a7fc20e..fbe5341 100644 --- a/lib/src/main/java/com/king/zxing/DecodeHandler.java +++ b/lib/src/main/java/com/king/zxing/DecodeHandler.java @@ -33,9 +33,12 @@ import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.MultiFormatReader; +import com.google.zxing.NotFoundException; import com.google.zxing.PlanarYUVLuminanceSource; +import com.google.zxing.ReaderException; import com.google.zxing.Result; import com.google.zxing.ResultPoint; +import com.google.zxing.common.GlobalHistogramBinarizer; import com.google.zxing.common.HybridBinarizer; import com.king.zxing.camera.CameraManager; @@ -103,17 +106,22 @@ final class DecodeHandler extends Handler { try { rawResult = multiFormatReader.decodeWithState(bitmap); } catch (Exception e) { - if(isSupportVerticalCode){ - source = buildPlanarYUVLuminanceSource(data,width,height,!isScreenPortrait); - if(source!=null){ - BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source)); - try{ - rawResult = multiFormatReader.decodeWithState(bitmap1); - }catch (Exception e1){ + BinaryBitmap bitmap1 = new BinaryBitmap(new GlobalHistogramBinarizer(source)); + try{ + rawResult = multiFormatReader.decodeWithState(bitmap1); + }catch (Exception e1){ + if(isSupportVerticalCode){ + source = buildPlanarYUVLuminanceSource(data,width,height,!isScreenPortrait); + if(source!=null){ + BinaryBitmap bitmap2 = new BinaryBitmap(new HybridBinarizer(source)); + try{ + rawResult = multiFormatReader.decodeWithState(bitmap2); + }catch (Exception e2){ + } } - } + } } } finally { diff --git a/lib/src/main/java/com/king/zxing/DecodeThread.java b/lib/src/main/java/com/king/zxing/DecodeThread.java index 65eb6e9..2f2d4a9 100644 --- a/lib/src/main/java/com/king/zxing/DecodeThread.java +++ b/lib/src/main/java/com/king/zxing/DecodeThread.java @@ -55,7 +55,7 @@ final class DecodeThread extends Thread { DecodeThread(Context context,CameraManager cameraManager, CaptureHandler captureHandler, Collection decodeFormats, - Map baseHints, + Map baseHints, String characterSet, ResultPointCallback resultPointCallback) { 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 61b1576..207a6f8 100644 --- a/lib/src/main/java/com/king/zxing/camera/CameraConfigurationManager.java +++ b/lib/src/main/java/com/king/zxing/camera/CameraConfigurationManager.java @@ -161,8 +161,6 @@ final class CameraConfigurationManager { parameters.setZoom(parameters.getMaxZoom() / 10); } - theCamera.setParameters(parameters); - initializeTorch(parameters, prefs, safeMode); CameraConfigurationUtils.setFocus( diff --git a/lib/src/main/java/com/king/zxing/util/CodeUtils.java b/lib/src/main/java/com/king/zxing/util/CodeUtils.java index 98907d1..0f36898 100644 --- a/lib/src/main/java/com/king/zxing/util/CodeUtils.java +++ b/lib/src/main/java/com/king/zxing/util/CodeUtils.java @@ -198,7 +198,8 @@ public class CodeUtils { BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); try { result = reader.decode(bitmap,hints); - } catch (Exception e) {//解析失败则通过GlobalHistogramBinarizer 再试一次 + } catch (Exception e) { + //解析失败则通过GlobalHistogramBinarizer 再试一次 BinaryBitmap bitmap1 = new BinaryBitmap(new GlobalHistogramBinarizer(source)); try { result = reader.decode(bitmap1); @@ -232,6 +233,7 @@ public class CodeUtils { decodeFormats.addAll(DecodeFormatManager.AZTEC_FORMATS); decodeFormats.addAll(DecodeFormatManager.PDF417_FORMATS); + hints.put(DecodeHintType.TRY_HARDER,Boolean.TRUE); hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); return parseCode(bitmapPath,hints); } @@ -257,7 +259,7 @@ public class CodeUtils { BinaryBitmap bitmap1 = new BinaryBitmap(new GlobalHistogramBinarizer(source)); try { result = reader.decodeWithState(bitmap1); - } catch (NotFoundException ne) { + } catch (Exception ne) { } } finally { diff --git a/versions.gradle b/versions.gradle index 6fd6860..91d55fc 100644 --- a/versions.gradle +++ b/versions.gradle @@ -29,7 +29,7 @@ versions.espresso = "3.0.2" //zxing versions.zxing = "3.3.3" -versions.easypermissions = "1.3.0" +versions.easypermissions = "2.0.1"