Giter Site home page Giter Site logo

xuexiangjys / xqrcode Goto Github PK

View Code? Open in Web Editor NEW
190.0 7.0 39.0 10.31 MB

A very convenient and practical qrcode scanning, analysis, generation library.(一个非常方便实用的二维码扫描、解析、生成库)

Home Page: https://xuexiangjys.github.io/XQRCode/

License: Apache License 2.0

Java 100.00%
qrcode-scanner qrcode-generator android xui x-library

xqrcode's Introduction

XQRCode

api I Star

一个非常方便实用的二维码扫描、解析、生成库

关于我

公众号 掘金 知乎 CSDN 简书 思否 哔哩哔哩 今日头条
我的Android开源之旅 点我 点我 点我 点我 点我 点我 点我

特点

  • 支持快速集成条形码、二维码扫描功能。
  • 支持自定义扫描界面。
  • 支持二维码多次扫描。
  • 支持生成带图标的二维码。
  • 支持生成带背景图片的复杂二维码。
  • 支持二维码解析功能

1、演示(请star支持)

xqrcode.gif

Demo下载

downloads

xqrcode_download.png

2、如何使用

目前支持主流开发工具AndroidStudio的使用,直接配置build.gradle,增加依赖即可.

2.1、Android Studio导入方法,添加Gradle依赖

1.先在项目根目录的 build.gradle 的 repositories 添加:

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

2.然后在应用项目(一般是app)的 build.gradle 的 dependencies 添加:

dependencies {
  ...
   // 如果是androidx项目,使用1.1.0版本及以上
  implementation 'com.github.xuexiangjys:XQRCode:1.1.1'
   // 如果是support项目,请使用1.0.6版本
  implementation 'com.github.xuexiangjys:XQRCode:1.0.6'
}

2.2、二维码扫描

默认二维码扫描

1.默认二维码扫描界面CaptureActivity

使用XQRCode.startScan直接调取默认二维码扫描。

XQRCode.startScan(this, REQUEST_CODE);

2.二维码的扫描结果通过Intent返回出来:

  • XQRCode.RESULT_TYPE:扫描结果类型,XQRCode.RESULT_SUCCESS代表扫描成功,XQRCode.RESULT_FAILED代表扫描失败。
  • XQRCode.RESULT_DATA:扫描二维码的数据内容。

3.自定义默认二维码扫描界面的主题样式:

<!-- 自定义默认二维码扫描界面的主题. -->
<style name="XQRCodeTheme.Custom">
    <item name="ViewfinderViewStyle">@style/ViewfinderView.Custom</item>
</style>

<style name="ViewfinderView.Custom">
    <item name="inner_corner_color">#123456</item>
    <item name="inner_corner_length">50dp</item>
    <item name="inner_corner_width">5dp</item>
    <item name="inner_scan_speed">20dp</item>
    <item name="inner_scan_isCircle">false</item>
</style>

4.自定义默认二维码扫描界面的界面样式,重写相关方法:

详细内容可参见CustomCaptureActivity

@Override
protected void beforeCapture() {
//做二维码采集之前需要做的事情
}

@Override
protected void onCameraInitSuccess() {
//相机初始化成功
}

@Override
protected void onCameraInitFailed() {
//相机初始化失败
}

下面的二维码扫描代码仅供参考:

/**
 * 开启二维码扫描
 */
@Permission(CAMERA)
private void startScan(ScanType scanType) {
    switch (scanType) {
        case DEFAULT:
            XQRCode.startScan(this, REQUEST_CODE);
            break;
        case DEFAULT_Custom:
            XQRCode.startScan(this, REQUEST_CODE, R.style.XQRCodeTheme_Custom);
            break;
        case REMOTE:
            Intent intent = new Intent(XQRCode.ACTION_DEFAULT_CAPTURE);
            startActivityForResult(intent, REQUEST_CODE);
            break;
        default:
            break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //处理二维码扫描结果
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        //处理扫描结果(在界面上显示)
        handleScanResult(data);
    }

    //选择系统图片并解析
    else if (requestCode == REQUEST_IMAGE) {
        if (data != null) {
            Uri uri = data.getData();
            getAnalyzeQRCodeResult(uri);
        }
    }
}

/**
 * 处理二维码扫描结果
 * @param data
 */
private void handleScanResult(Intent data) {
    if (data != null) {
        Bundle bundle = data.getExtras();
        if (bundle != null) {
            if (bundle.getInt(XQRCode.RESULT_TYPE) == XQRCode.RESULT_SUCCESS) {
                String result = bundle.getString(XQRCode.RESULT_DATA);
                ToastUtils.toast("解析结果:" + result, Toast.LENGTH_LONG);
            } else if (bundle.getInt(XQRCode.RESULT_TYPE) == XQRCode.RESULT_FAILED) {
                ToastUtils.toast("解析二维码失败", Toast.LENGTH_LONG);
            }
        }
    }
}

/**
 * 进行二维码解析
 *
 * @param uri
 */
private void getAnalyzeQRCodeResult(Uri uri) {
    XQRCode.analyzeQRCode(PathUtils.getFilePathByUri(getContext(), uri), new QRCodeAnalyzeUtils.AnalyzeCallback() {
        @Override
        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
            ToastUtils.toast("解析结果:" + result, Toast.LENGTH_LONG);
        }

        @Override
        public void onAnalyzeFailed() {
            ToastUtils.toast("解析二维码失败", Toast.LENGTH_LONG);
        }
    });
}

自定义二维码扫描

  1. 自定义一个扫码界面布局。自定义的扫码界面需要定义一个SurfaceView和一个ViewfinderView,且id必须是preview_viewviewfinder_view。详情见如下布局代码:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <com.xuexiang.xqrcode.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:inner_corner_color="@color/scan_corner_color"
        app:inner_corner_length="30dp"
        app:inner_corner_width="5dp"
        app:inner_marginTop="120dp"
        app:inner_scan_bitmap="@mipmap/ic_scan_image"
        app:inner_scan_isCircle="false"
        app:inner_scan_speed="10dp"
        app:inner_height="300dp"
        app:inner_width="300dp" />

</FrameLayout>

ViewfinderView属性表

属性名 类型 默认值 备注
inner_width dimension 屏幕宽度的3/4 扫描框的宽度
inner_height dimension 屏幕宽度的3/4 扫描框的高度
inner_marginTop dimension 居中效果 扫描框距离顶部的距离
inner_corner_color color #0DC2FE 扫描框四角的颜色
inner_corner_length dimension 32dp 扫描框四角的长度
inner_corner_width dimension 6dp 扫描框四角的宽度
inner_scan_bitmap reference R.drawable.xqrcode_ic_scan_light 扫描控件图资源
inner_scan_bitmap_tint color / 扫描控件图资源的色调
inner_scan_speed dimension 5dp 扫描速度
inner_scan_animation_interval integer 25 扫描动画绘制的间期,单位是ms
inner_scan_isCircle boolean true 小圆点是否展示
  1. 调用XQRCode.getCaptureFragment的方法,传入自定义扫描界面的布局ID,可以获得带扫描功能的Fragment-CaptureFragment,将其填充到页面中。
// 为二维码扫描界面设置定制化界面
CaptureFragment captureFragment = XQRCode.getCaptureFragment(R.layout.layout_custom_camera);
captureFragment.setAnalyzeCallback(analyzeCallback);
getChildFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();
  1. 最后为CaptureFragment设置二维码解析回调接口AnalyzeCallback即可。

设置相机聚焦的间隔

//设置相机的自动聚焦间隔
XQRCode.setAutoFocusInterval(1500L);

2.3、二维码生成

1.简单的二维码生成

调用XQRCode.createQRCodeWithLogo,传入二维码携带的内容、尺寸、图标即可生成二维码Bitmap。

2.复杂的二维码生成

调用XQRCode.newQRCodeBuilder可以获得二维码生成构建者。可设置的参数如下:

  • setContents: 设置二维码携带的内容
  • setSize: 设置二维码的尺寸
  • setMargin: 设置二维码的边缘宽度
  • setDataDotScale: 设置二维码的数据点缩放比例
  • setColorDark: 设置深色点(true-dots)色值
  • setColorLight: 设置浅色点(false-dots)色值
  • setBackgroundImage: 设置背景图案
  • setWhiteMargin: 设置是否是白色的边缘
  • setAutoColor: 设置是否自动从背景图案中选取色值
  • setBinarize: 设置是否(二值化)灰度化背景图案
  • setBinarizeThreshold: 设置二值化中值

最后调用build方法即可生成二维码。

2.4、二维码解析

1.只需要解析二维码携带的数据内容,可直接调用XQRCode.analyzeQRCode方法,传入二维码的绝对路径即可。

2.如果需要完整的二维码解析结果,可调用XQRCode.getAnalyzeQRCodeResult方法,传入二维码的绝对路径即可。

混淆配置

-dontwarn com.google.zxing.**
-keep class com.google.zxing.**{*;}

特别感谢

https://github.com/yipianfengye/android-zxingLibrary

如果觉得项目还不错,可以考虑打赏一波

你的打赏是我维护的动力,我将会列出所有打赏人员的清单在下方作为凭证,打赏前请留下打赏项目的备注!

pay.png

公众号

更多资讯内容,欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】

xqrcode's People

Contributors

xuexiangjys 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

xqrcode's Issues

自定义扫码区域位置

自定义扫码区域位置 我改变你那个自定义布局 扫码框大小 和 margintop后 识别率 变小 其他没动

android 12

Manifest merger failed : android:exported needs to be explicitly specified for element

我发现了扫码区域问题 你的demo

<com.xuexiang.xqrcode.view.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:inner_corner_color="@color/scan_corner_color"
app:inner_corner_length="30dp"
app:inner_corner_width="5dp"
app:inner_marginTop="10dp"
app:inner_scan_bitmap="@mipmap/ic_scan_image"
app:inner_scan_isCircle="false"
app:inner_scan_speed="10"
app:inner_height="240dp"
app:inner_width="240dp" />
我修改你的扫码框区域在你的自定义布局中 可是你的扫码识别范围不在扫码框里 本来我这样修改后 识别是在顶部 可是测试发现 还是在之前那个位置

提个疑问

当二维码不清晰或者是模糊时,对识别率有影响,像下面这种

4
1
2
3
5

Camera is being used after Camera.release() was called

java.lang.RuntimeException: Camera is being used after Camera.release() was called
at android.hardware.Camera._stopPreview(Native Method)
at android.hardware.Camera.stopPreview(Camera.java:922)
at com.xuexiang.xqrcode.ui.CaptureFragment.surfaceDestroyed(CaptureFragment.java:282)
at android.view.SurfaceView.updateWindow(SurfaceView.java:602)
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:251)

关于自定义扫描框的问题

你的自定义扫描跟很多人分享的二维码扫描库都有一个通病,就是对准二维码就很难识别,拿远点才容易识别,你可以测试一下。

关于用户没有提供权限,直接调用开启扫码时,扫码界面黑屏

关于用户没有提供权限,直接调用开启扫码时,扫码界面黑屏,XQRCode 在没有权限的情况下,扫码界面黑麻麻的,有机制可以try到没有权限,并且提示用户开启吗?
现在的问题是,我刚刚说的部分手机做了特别处理,不管用户同意与否,我用好多权限框架,包括谷歌的方法,都是返回true,所以我是想再开启摄像头的时候try一下那个异常来判断用户是否真的授权

自定义界面可以直接使用activity吗?

提示信息有了,但是我用的是默认扫码界面,我看自定义界面需要继承你写的一些东西,我直接用activity做为自定义界面,不继承你写的东西启动会闪退

关于声音和几个类丢失

兄台,,,有几个类比如IntentUtils,ClickUtils类没有,,,还有就是能不能加上声音提示,谢谢

进入“选择二维码进行解析”之后选择图片,应用闪退

在AS自带的模拟机上运行,运行的是作者给出的apk安装包或者直接运行AS项目,进入“选择二维码进行解析”选择图片,之后就闪退(其它功能正常)ps:奇怪的是真机不会闪退
Screenshot_1588477093
但是XUI不会,正常运行。不知道是不是二者版本不一样

对焦问题

请问你的demo 在哪里设置对焦问题 比如自动对焦 或者隔几秒对焦

二维码识别不灵敏问题

平板开发时,使用华为的畅想平板4,识别二维码的效率非常低,尝试降低聚焦间隔为200ms,效果提升不明显,自己在识别二维码时,除非找到某一个临界区域,否则二维码一直识别不出来,刚开始测试的时候,因为我做的位置,电脑屏幕摆放的位置,正好在临界区域,一直没有发现,我们测试,在测试时发现了这个问题,而且还能百分百复现;

bug复现(设置为横屏,聚焦间隔为200ms):任意找一个二维码,让扫描框刚好能包含这个二维码,是扫描不出来的,这时缓慢的拉远镜头,直到让二维码,处于扫描框的二分之一到三分之一处,识别效率很高,其它的位置识别效率不是很高;

同时自己也尝试使用了华为,三星手机进行测试,发现手机配置越高,识别效率越高,但是效率仅仅提升了一点,还是会出现上面的问题;

自己也在考虑是不是我们生成的二维码有问题,于是就是用草料二维码,分别对比其他软件的二维码扫描功能,发现XQR也存在上面的问题;

ViewfinderView.onDraw 小概率崩溃

at com.xuexiang.xqrcode.view.ViewfinderView.onDraw(ViewfinderView.java:161)

for (ResultPoint point : currentPossible)

这个currentPossible会在另一个线程中修改
public void addPossibleResultPoint(ResultPoint point) {
mPossibleResultPoints.add(point);
}

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.