一个非常方便实用的二维码扫描、解析、生成库
公众号 | 掘金 | 知乎 | CSDN | 简书 | 思否 | 哔哩哔哩 | 今日头条 |
---|---|---|---|---|---|---|---|
我的Android开源之旅 | 点我 | 点我 | 点我 | 点我 | 点我 | 点我 | 点我 |
- 支持快速集成条形码、二维码扫描功能。
- 支持自定义扫描界面。
- 支持二维码多次扫描。
- 支持生成带图标的二维码。
- 支持生成带背景图片的复杂二维码。
- 支持二维码解析功能
目前支持主流开发工具AndroidStudio的使用,直接配置build.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'
}
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);
}
});
}
- 自定义一个扫码界面布局。自定义的扫码界面需要定义一个
SurfaceView
和一个ViewfinderView
,且id必须是preview_view
和viewfinder_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 | 小圆点是否展示 |
- 调用
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();
- 最后为CaptureFragment设置二维码解析回调接口
AnalyzeCallback
即可。
//设置相机的自动聚焦间隔
XQRCode.setAutoFocusInterval(1500L);
1.简单的二维码生成
调用XQRCode.createQRCodeWithLogo
,传入二维码携带的内容、尺寸、图标即可生成二维码Bitmap。
2.复杂的二维码生成
调用XQRCode.newQRCodeBuilder
可以获得二维码生成构建者。可设置的参数如下:
- setContents: 设置二维码携带的内容
- setSize: 设置二维码的尺寸
- setMargin: 设置二维码的边缘宽度
- setDataDotScale: 设置二维码的数据点缩放比例
- setColorDark: 设置深色点(true-dots)色值
- setColorLight: 设置浅色点(false-dots)色值
- setBackgroundImage: 设置背景图案
- setWhiteMargin: 设置是否是白色的边缘
- setAutoColor: 设置是否自动从背景图案中选取色值
- setBinarize: 设置是否(二值化)灰度化背景图案
- setBinarizeThreshold: 设置二值化中值
最后调用build
方法即可生成二维码。
1.只需要解析二维码携带的数据内容,可直接调用XQRCode.analyzeQRCode
方法,传入二维码的绝对路径即可。
2.如果需要完整的二维码解析结果,可调用XQRCode.getAnalyzeQRCodeResult
方法,传入二维码的绝对路径即可。
-dontwarn com.google.zxing.**
-keep class com.google.zxing.**{*;}
https://github.com/yipianfengye/android-zxingLibrary
你的打赏是我维护的动力,我将会列出所有打赏人员的清单在下方作为凭证,打赏前请留下打赏项目的备注!
更多资讯内容,欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】