GithubHelp home page GithubHelp logo

mylhyl / android-zxing Goto Github PK

View Code? Open in Web Editor NEW
573.0 30.0 168.0 14.2 MB

android google zxing 可配置扫描框、线样式 ,生成二维码(文字、联系人)

Home Page: http://blog.csdn.net/hupei/article/details/51859171

Java 100.00%
zxing android-zxing

android-zxing's Introduction

JCenter迁移说明

JCenter服务已经宣布停止维护,对于旧版本大家可以使用阿里云镜像引用,以后新版本将会发布在JitPack

1、旧版本阿里云镜像引用方式

在项目根目录下的build.gradle文件中加入

 allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
    }
 }

1、新版本JitPack引用方式

在项目根目录下的build.gradle文件中加入

 allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
 }

一、功能

  • 支持全屏或局部扫描
  • 定制扫描框颜色
  • 扫描线样式
  • 扫描提示语
  • 创建二维码
  • 识别图片中二维码

二、效果图

三、下载APK体验或手机扫描下面二维码

四、引用

1、在线 本库内部已集成zxing:core:3.4.0

  • 依赖使用 Gradle 构建时添加一下即可
compile 'com.mylhyl:zxingscanner:2.2.0'

2、离线jar,需要手动添加 Zxing 核心库

compile 'com.google.zxing:core:3.4.0'

gradle makeJar 或者参考下图,在android studio中执行

这里写图片描述

五、使用

例子

直接在layout xml使用ScannerView即可

<com.mylhyl.zxing.scanner.ScannerView
    android:id="@+id/scanner_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
注意生命周期中的使用

重写onResume调用mScannerView.onResume();

@Override
protected void onResume() {
    mScannerView.onResume();
    super.onResume();
}

@Override
protected void onPause() {
    mScannerView.onPause();
    super.onPause();
}

注册扫描成功监听器mScannerView.setOnScannerCompletionListener

/**
 * 扫描成功后将调用
 *
 * @param rawResult    扫描结果
 * @param parsedResult 结果类型
 * @param barcode      扫描后的图像
 */
void OnScannerCompletion(Result rawResult, ParsedResult parsedResult, Bitmap barcode);

开启闪光灯

mScannerView.toggleLight(true);//开
mScannerView.toggleLight(false);//关

调用如下方法获取类型

ParsedResultType type = parsedResult.getType();

可根据type强转为相应的对象,按项目需求处理。每个项目都有不同的需求,所以此库将最终处理结果丢给你们自己咯,想怎么玩就怎么玩,下面代码是在 sample 中

switch (type) {
    case ADDRESSBOOK:
	AddressBookParsedResult addressBook = (AddressBookParsedResult) parsedResult;
        bundle.putSerializable(Intents.Scan.RESULT, new AddressBookResult(addressBook));
        break;
    case URI:
        URIParsedResult uriParsedResult = (URIParsedResult) parsedResult;
        bundle.putString(Intents.Scan.RESULT, uriParsedResult.getURI());
        break;
    case TEXT:
        bundle.putString(Intents.Scan.RESULT, rawResult.getText());
        break;
}

生成二维码使用

//联系人类型
Bitmap bitmap = new QREncode.Builder(this)
        .setParsedResultType(ParsedResultType.ADDRESSBOOK)
        .setAddressBookUri(contactUri).build().encodeAsBitmap();

//文本类型
Bitmap bitmap = new QREncode.Builder(this)
        .setColor(getResources().getColor(R.color.colorPrimary))//二维码颜色
        //.setParsedResultType(ParsedResultType.TEXT)//默认是TEXT类型
        .setContents("我是石头")//二维码内容
        .setLogoBitmap(logoBitmap)//二维码中间logo
        .build().encodeAsBitmap();

解析图中二维码

    public static void decodeQR(String picturePath, OnScannerCompletionListener listener);
    public static void decodeQR(Bitmap srcBitmap, final OnScannerCompletionListener listener)

六、样式设置

说明:1.6.0以后版本将废弃ScannerView样式设置,使用新增ScannerOptions,后续版本只会在ScannerOptions中维护。
具体api请看ScannerOptions.Builder

七、注意事项

权限

<uses-permission android:name="android.permission.CAMERA" />

八、常见问题

  • 对于setLaserFrameTopMargin方法,扫描区域偏移的问题issues-13
  • 可以在扫描成功后,调用restartPreviewAfterDelay连续扫描
  • 对于加密后的二维码,判断二维码类型可以如下:
	//重新包装`Result`,`decryptText`为解密后的内容
        Result decryptResult = new Result(decryptText, rawResult.getRawBytes(),
                rawResult.getNumBits(), rawResult.getResultPoints(), 
                rawResult.getBarcodeFormat(), rawResult.getTimestamp());
	//转换扫描结果为类型枚举
        ParsedResult decryptParsedResult = Scanner.parseResult(decryptResult);
        final ParsedResultType decryptType = decryptParsedResult.getType();
        switch (decryptType) {
            //类型分支
	    case :
	    	break;
        }

联系方式

  • 可能会因为工作忙碌原因没有及时回复,大家方便的话可以加我个人微信号:48025211,备注:github

android-zxing's People

Contributors

mylhyl avatar yysnow avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-zxing's Issues

把扫描框设置在顶部的问题

我这边有个需求需要把扫描框设置在布局顶部,但是实际效果是顶部空出状态栏的高度,有没有办法把状态栏的那部分高度去掉吗?

打开问题

在我自己的android项目中引用了zxingscanner,但是打开扫描二维码的页面总是打开已安装你这个demo的扫描二维码页面

扫描的速度很慢,效率很低

扫描的速度很慢,效率很低,不管是条形码还是二维码,基本早扫描线来回4~5次,才能扫上,是否再优化下,或条码与二维码分开

刚一安装就崩溃

07-13 16:29:59.031 390-390/com.mylhyl.zxing.scanner.sample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mylhyl.zxing.scanner.sample, PID: 390
java.lang.RuntimeException: Unable to instantiate application com.mylhyl.zxing.scanner.sample.APP: java.lang.ClassNotFoundException: Didn't find class "com.mylhyl.zxing.scanner.sample.APP" on path: DexPathList[[zip file "/data/app/com.mylhyl.zxing.scanner.sample-1/base.apk"],nativeLibraryDirectories=[/data/resource/lib, /vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:563)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4532)
at android.app.ActivityThread.access$1500(ActivityThread.java:152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1365)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5260)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.mylhyl.zxing.scanner.sample.APP" on path: DexPathList[[zip file "/data/app/com.mylhyl.zxing.scanner.sample-1/base.apk"],nativeLibraryDirectories=[/data/resource/lib, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newApplication(Instrumentation.java:980)
at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4532) 
at android.app.ActivityThread.access$1500(ActivityThread.java:152) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1365) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5260) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697) 
Suppressed: java.lang.ClassNotFoundException: com.mylhyl.zxing.scanner.sample.APP
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

连续扫描,界面闪烁

当设置成连续扫描,调用restartPreviewAfterDelay方法清除残像,但是当时间设置未0的时候,界面就会闪烁
image

setLaserFrameTopMargin后nexus 5x下扫描框和扫描区域不一致

screenshot_20171115-144826

如图,在二维码区域时,才能识别出结果,在扫描框中识别不出,貌似是轴对称关系。
如果不设置LaserFrameTopMargin,扫描框在屏幕正中间时是没问题的。
ps:nexus 5x摄像头的旋转角度是270度

代码如下:

mScanView = findViewById(R.id.scan_view);
mScanView.setLaserFrameTopMargin(50) .setLaserFrameSize(240, 240) .setOnScannerCompletionListener(this);

颜色设置问题

使用setLaserFrameBoundColor()和setLaserColor() 方法无法正常为扫描四角与扫描线设置颜色。设置之后显示黑色。
mScannerView.setLaserFrameBoundColor(R.color.colorPrimary); mScannerView.setLaserColor(R.color.colorPrimary);

关于摄像头权限开启问题

在金立手机上除了开发者自己申请一次权限外, 打开cramer时候也会申请一次权限,开发者无法监听到, 哪怕第一次允许。 是都可以暴漏个接口监听cramer是否开启成功。

ArrayIndexOutOfBoundsException and IllegalArgumentException

7.0 分屏下崩溃
ava.lang.ArrayIndexOutOfBoundsException: src.length=3110400 srcPos=-20628 dst.length=829437 dstPos=0 length=933 at java.lang.System.arraycopy(System.java:521) at com.google.zxing.PlanarYUVLuminanceSource.getMatrix(PlanarYUVLuminanceSource.java:101) at com.google.zxing.common.GlobalHistogramBinarizer.getBlackMatrix(GlobalHistogramBinarizer.java:118) at com.google.zxing.BinaryBitmap.getBlackMatrix(BinaryBitmap.java:85) at com.google.zxing.qrcode.QRCodeReader.decode(QRCodeReader.java:77) at com.google.zxing.MultiFormatReader.decodeInternal(MultiFormatReader.java:171) at com.google.zxing.MultiFormatReader.decodeWithState(MultiFormatReader.java:85) at com.mylhyl.zxing.scanner.decode.DecodeHandler.decode(DecodeHandler.java:99) at com.mylhyl.zxing.scanner.decode.DecodeHandler.handleMessage(DecodeHandler.java:62) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at com.mylhyl.zxing.scanner.decode.DecodeThread.run(DecodeThread.java:104)

java.lang.IllegalArgumentException: Crop rectangle does not fit within image data. at com.google.zxing.PlanarYUVLuminanceSource.<init>(PlanarYUVLuminanceSource.java:50) at com.mylhyl.zxing.scanner.camera.CameraManager.buildLuminanceSource(CameraManager.java:376) at com.mylhyl.zxing.scanner.decode.DecodeHandler.decode(DecodeHandler.java:96) at com.mylhyl.zxing.scanner.decode.DecodeHandler.handleMessage(DecodeHandler.java:63) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at com.mylhyl.zxing.scanner.decode.DecodeThread.run(DecodeThread.java:104)

在布局不是全屏情况下扫描框和解码的提取的图片不对应

CameraManager中getFramingRectInPreview方法提取previewframe中扫描范围时,使用的计算方法是否不太准确,转换使用的是screenResolution是屏幕的大小,但实际上给用户看到的渲染范围有可能不是全屏的,因此转换是不是有误差,建议改为使用sufaceview的范围来计算:
Point screenResolution;
if(sufaceRect != null){
screenResolution = new Point(sufaceRect.right-sufaceRect.left,sufaceRect.bottom-sufaceRect.top);
} else {
screenResolution = configManager.getScreenResolution();//屏幕范围来近似摄像头渲染的范围
}

sufaceRect在给摄像头设置holder时记录:
cameraObject.setPreviewDisplay(holder);
sufaceRect = holder.getSurfaceFrame()

如何再次扫码

扫码成功后好像不能进行第二次扫码 退出之后再进来才行

横屏扫描问题

启动横屏扫描,锁屏解锁后,屏幕黑屏或显示不出来或直接退出到上一个界面

是否条形码的返回结果没有进行解码处理?

this method should be public ,not private
private void onPause() {
if(this.mScannerViewHandler != null) {
this.mScannerViewHandler.quitSynchronously();
this.mScannerViewHandler = null;
}

    this.mBeepManager.close();
    this.mCameraManager.closeDriver();
    if(!this.hasSurface) {
        SurfaceHolder surfaceHolder = this.mSurfaceView.getHolder();
        surfaceHolder.removeCallback(this);
    }

    this.mViewfinderView.laserLineBitmapRecycle();
}

背景颜色

生成二维码的时候怎么设置二维码的背景颜色,也就是自定义二维码的前景色和背景色。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.