diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index d7a1447..97ee803 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/README.md b/README.md index 65f38c1..4e07666 100644 --- a/README.md +++ b/README.md @@ -45,17 +45,17 @@ ZXingLite for Android 是ZXing的精简版,基于ZXing库优化扫码和生成 com.king.zxing zxing-lite - 1.0.7 + 1.1.0 pom ``` ### Gradle: ```gradle -implementation 'com.king.zxing:zxing-lite:1.0.7' +implementation 'com.king.zxing:zxing-lite:1.1.0' ``` ### Lvy: ```lvy - + ``` @@ -79,16 +79,20 @@ api 'com.google.zxing:core:3.3.3' 布局示例 (可自定义布局,布局内至少要保证有SurfaceView和ViewfinderView,控件id可根据重写CaptureActivity 的 getPreviewViewId 和 getViewFinderViewId方法自定义) ```Xml - + + - + + ``` 代码示例 (二维码/条形码) @@ -102,9 +106,25 @@ api 'com.google.zxing:core:3.3.3' CodeUtils.createBarCode(content, BarcodeFormat.CODE_128,800,200); ``` +### 快速实现扫码有以下几种方式: + +> 1、直接使用CaptureActivity或者CaptureFragment。(纯洁的扫码,无任何添加剂) + +> 2、通过继承CaptureActivity或者CaptureFragment并自定义布局。(适用于大多场景,并无需关心扫码相关逻辑) + +> 3、在你项目的Activity或者Fragment中创建创建一个CaptureHelper并在相应的生命周期中调用CaptureHelper的周期。(适用于想在扫码界面写交互逻辑,又因为项目架构或其它原因,无法直接或间接继承CaptureActivity或CaptureFragment时使用) + +> 4、参照CaptureHelper写一个自定义的扫码帮助类,其它步骤同方式3。(扩展高级用法,谨慎使用) + + 更多使用详情,请查看[app](app)中的源码使用示例 ## 版本记录 + +#### v1.1.0:2019-4-19 +* 将扫码相关逻辑与界面分离,ZXingLite使用更容易扩展。 +* 新增CaptureFragment + #### v1.0.7:2019-4-9 * 新增网格样式的扫描激光(类似支付宝扫码样式) * 升级Gradle至v4.6 diff --git a/app/release/app-release.apk b/app/release/app-release.apk index ece8e6a..0c3126a 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/release/output.json b/app/release/output.json index dced801..90a54ae 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":8,"versionName":"1.0.7","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":9,"versionName":"1.1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 494edf2..51e3d6f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,12 +21,25 @@ + + + + + + + diff --git a/app/src/main/java/com/king/zxing/app/CaptureFragmentActivity.java b/app/src/main/java/com/king/zxing/app/CaptureFragmentActivity.java new file mode 100644 index 0000000..6155c18 --- /dev/null +++ b/app/src/main/java/com/king/zxing/app/CaptureFragmentActivity.java @@ -0,0 +1,39 @@ +package com.king.zxing.app; + +import android.os.Bundle; +import android.support.annotation.IdRes; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.widget.TextView; + +import com.king.zxing.CaptureFragment; +import com.king.zxing.app.util.StatusBarUtils; + +/** + * Fragment扫码 + * @author Jenly + */ +public class CaptureFragmentActivity extends AppCompatActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.fragment_activity); + 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)); + + replaceFragment(CaptureFragment.newInstance()); + } + + public void replaceFragment(Fragment fragment){ + replaceFragment( R.id.fragmentContent,fragment); + } + + public void replaceFragment(@IdRes int id, Fragment fragment) { + getSupportFragmentManager().beginTransaction().replace(id, fragment).commit(); + } +} diff --git a/app/src/main/java/com/king/zxing/app/CustomActivity.java b/app/src/main/java/com/king/zxing/app/CustomActivity.java new file mode 100644 index 0000000..feffd43 --- /dev/null +++ b/app/src/main/java/com/king/zxing/app/CustomActivity.java @@ -0,0 +1,143 @@ +package com.king.zxing.app; + +import android.hardware.Camera; +import android.os.Bundle; +import android.app.Activity; +import android.support.v7.app.AppCompatActivity; +import android.support.v4.app.Fragment; +import android.support.v7.widget.Toolbar; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import com.king.zxing.CaptureHelper; +import com.king.zxing.OnCaptureCallback; +import com.king.zxing.ViewfinderView; +import com.king.zxing.app.util.StatusBarUtils; + +/** + * 自定义扫码:当直接使用CaptureActivity + * 自定义扫码,切记自定义扫码需在{@link Activity}或者{@link Fragment}相对应的生命周期里面调用{@link #mCaptureHelper}对应的生命周期 + * @author Jenly + */ +public class CustomActivity extends AppCompatActivity implements OnCaptureCallback { + + private boolean isContinuousScan; + + private CaptureHelper mCaptureHelper; + + private SurfaceView surfaceView; + + private ViewfinderView viewfinderView; + + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setContentView(R.layout.custom_activity); + + initUI(); + } + + private void initUI(){ + + 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)); + + + surfaceView = findViewById(R.id.surfaceView); + viewfinderView = findViewById(R.id.viewfinderView); + + isContinuousScan = getIntent().getBooleanExtra(MainActivity.KEY_IS_CONTINUOUS,false); + + mCaptureHelper = new CaptureHelper(this,surfaceView,viewfinderView); + mCaptureHelper.onCreate(); + mCaptureHelper.vibrate(true) + .continuousScan(isContinuousScan); + } + + @Override + protected void onResume() { + super.onResume(); + mCaptureHelper.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + mCaptureHelper.onPause(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mCaptureHelper.onDestroy(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + mCaptureHelper.onTouchEvent(event); + return super.onTouchEvent(event); + } + + /** + * 关闭闪光灯(手电筒) + */ + private void offFlash(){ + Camera camera = mCaptureHelper.getCameraManager().getOpenCamera().getCamera(); + Camera.Parameters parameters = camera.getParameters(); + parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); + camera.setParameters(parameters); + } + + /** + * 开启闪光灯(手电筒) + */ + public void openFlash(){ + Camera camera = mCaptureHelper.getCameraManager().getOpenCamera().getCamera(); + Camera.Parameters parameters = camera.getParameters(); + parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); + camera.setParameters(parameters); + } + + + /** + * 扫码结果回调 + * @param result 扫码结果 + * @return + */ + @Override + public boolean onResultCallback(String result) { + if(isContinuousScan){ + Toast.makeText(this,result,Toast.LENGTH_SHORT).show(); + } + return false; + } + + + private void clickFlash(View v){ + if(v.isSelected()){ + offFlash(); + v.setSelected(false); + }else{ + openFlash(); + v.setSelected(true); + } + + } + + public void OnClick(View v){ + switch (v.getId()){ + case R.id.ivLeft: + onBackPressed(); + break; + case R.id.ivFlash: + clickFlash(v); + break; + } + } +} 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 fe51539..010e3cf 100644 --- a/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java +++ b/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java @@ -27,6 +27,7 @@ import com.king.zxing.CaptureActivity; import com.king.zxing.app.util.StatusBarUtils; /** + * 自定义继承CaptureActivity * @author Jenly Jenly */ public class CustomCaptureActivity extends CaptureActivity { @@ -46,9 +47,10 @@ public class CustomCaptureActivity extends CaptureActivity { tvTitle.setText(getIntent().getStringExtra(MainActivity.KEY_TITLE)); isContinuousScan = getIntent().getBooleanExtra(MainActivity.KEY_IS_CONTINUOUS,false); - - getBeepManager().setPlayBeep(true); - getBeepManager().setVibrate(true); + //获取CaptureHelper,里面有扫码相关的配置设置 + getCaptureHelper().playBeep(true)//播放音效 + .vibrate(true)//震动 + .continuousScan(isContinuousScan);//是否连扫 } /** @@ -71,37 +73,21 @@ public class CustomCaptureActivity extends CaptureActivity { camera.setParameters(parameters); } + /** - * 接收扫码结果,想支持连扫时,可将{@link #isContinuousScan()}返回为{@code true}并重写此方法 - * 如果{@link #isContinuousScan()}支持连扫,则默认重启扫码和解码器;当连扫逻辑太复杂时, - * 请将{@link #isAutoRestartPreviewAndDecode()}返回为{@code false},并手动调用{@link #restartPreviewAndDecode()} + * 扫码结果回调 * @param result 扫码结果 + * @return */ @Override - public void onResult(Result result) { - super.onResult(result); + public boolean onResultCallback(String result) { if(isContinuousScan){//连续扫码时,直接弹出结果 - Toast.makeText(this,result.getText(),Toast.LENGTH_SHORT).show(); + Toast.makeText(this,result,Toast.LENGTH_SHORT).show(); } + + return super.onResultCallback(result); } - /** - * 是否连续扫码,如果想支持连续扫码,则将此方法返回{@code true}并重写{@link #onResult(Result)} - * @return 默认返回 false - */ - @Override - public boolean isContinuousScan() { - return isContinuousScan; - } - - /** - * 是否自动重启扫码和解码器,当支持连扫时才起作用。 - * @return 默认返回 true - */ - @Override - public boolean isAutoRestartPreviewAndDecode() { - return super.isAutoRestartPreviewAndDecode(); - } private void clickFlash(View v){ if(v.isSelected()){ 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 f98eb1b..6b13bd0 100644 --- a/app/src/main/java/com/king/zxing/app/MainActivity.java +++ b/app/src/main/java/com/king/zxing/app/MainActivity.java @@ -18,7 +18,6 @@ package com.king.zxing.app; import android.Manifest; import android.content.Context; import android.content.Intent; -import android.graphics.BitmapFactory; import android.provider.MediaStore; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; @@ -30,8 +29,6 @@ import android.view.View; import android.widget.Button; import android.widget.Toast; -import com.google.zxing.DecodeHintType; -import com.google.zxing.common.StringUtils; import com.king.zxing.CaptureActivity; import com.king.zxing.Intents; import com.king.zxing.app.util.UriUtils; @@ -42,6 +39,20 @@ import java.util.List; import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.EasyPermissions; +/** + * 扫码Demo示例说明 + * + * 快速实现扫码有以下几种方式: + * + * 1、直接使用CaptureActivity或者CaptureFragment。(纯洁的扫码,无任何添加剂) + * + * 2、通过继承CaptureActivity或者CaptureFragment并自定义布局。(适用于大多场景,并无需关心扫码相关逻辑) + * + * 3、在你项目的Activity或者Fragment中创建创建一个CaptureHelper并在相应的生命周期中调用CaptureHelper的周期。(适用于想在扫码界面写交互逻辑,又因为项目架构或其它原因,无法直接或间接继承CaptureActivity或CaptureFragment时使用) + * + * 4、参照CaptureHelper写一个自定义的扫码帮助类,其它步骤同方式3。(扩展高级用法,谨慎使用) + * + */ public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{ public static final String KEY_TITLE = "key_title"; @@ -195,18 +206,18 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P isContinuousScan = false; switch (v.getId()){ case R.id.btn0: + this.cls = CaptureActivity.class; + this.title = ((Button)v).getText().toString(); + checkCameraPermissions(); + break; + case R.id.btn1: this.cls = CustomCaptureActivity.class; this.title = ((Button)v).getText().toString(); isContinuousScan = true; checkCameraPermissions(); break; - case R.id.btn1: - this.cls = CaptureActivity.class; - this.title = ((Button)v).getText().toString(); - checkCameraPermissions(); - break; case R.id.btn2: - this.cls = EasyCaptureActivity.class; + this.cls = CaptureFragmentActivity.class; this.title = ((Button)v).getText().toString(); checkCameraPermissions(); break; @@ -216,12 +227,17 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P checkCameraPermissions(); break; case R.id.btn4: - startCode(false); + this.cls = CustomActivity.class; + this.title = ((Button)v).getText().toString(); + checkCameraPermissions(); break; case R.id.btn5: - startCode(true); + startCode(false); break; case R.id.btn6: + startCode(true); + break; + case R.id.btn7: checkExternalStoragePermissions(); break; } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0d14fb0..52b9a40 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -26,13 +26,6 @@ android:layout_gravity="center_horizontal" android:text="@string/app_name"/> -