android studio 集成zxing二维码,条形码扫描
16lz
2021-01-25
android studio 集成zxing二维码,条形码扫描
android studio 集成zxing 扫描器 扫描框、扫描线定制样式
直接上代码。代码说明:
一、添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.CAMERA" />
二、配置app build.gradle
compile 'com.google.zxing:core:3.2.1' compile 'com.journeyapps:zxing-android-embedded:3.5.0'
三、Activity使用
(1)Activity代码
public class SecondActivity extends AppCompatActivity { CompoundBarcodeView mBarcodeView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); mBarcodeView = (CompoundBarcodeView) findViewById(R.id.dbv_custom); if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1); } else { // Choose only one!!!这一个是扫描结果只会出来一次 mBarcodeView.decodeSingle(callback); // Or这一是扫描结果一直会打印出来 //mBarcodeView.decodeContinuous(callback); } } private BarcodeCallback callback = new BarcodeCallback() { @Override public void barcodeResult(BarcodeResult result) { // Do something with the scanned QR code. // result.getText() returns decoded QR code. //mBarcodeView. System.out.println("______________________________"+result.getText()); /* if(!TextUtils.isEmpty(result.getText())){ mBarcodeView.decodeContinuous(null); }*/ } @Override public void possibleResultPoints(List resultPoints) { } }; @Override protected void onPause() { super.onPause(); mBarcodeView.pause(); } @Override protected void onResume() { super.onResume(); mBarcodeView.resume(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == 1) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Choose only one!!! mBarcodeView.decodeSingle(callback); // Or //mBarcodeView.decodeContinuous(callback); return; } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }}
(2)activity布局文件代码
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:gravity="center" > <com.journeyapps.barcodescanner.CompoundBarcodeView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/dbv_custom" app:zxing_scanner_layout="@layout/code_scanning_scanner" > com.journeyapps.barcodescanner.CompoundBarcodeView>LinearLayout>
其中重点是 app:zxing_scanner_layout=”@layout/code_scanning_scanner”
code_scanning_scanner控制扫描页面的样式,下面重点解析。
(3)code_scanning_scanner代码
<?xml version="1.0" encoding="utf-8"?><merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"> <com.journeyapps.barcodescanner.BarcodeView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/zxing_barcode_surface" app:zxing_framing_rect_width="250dp" app:zxing_framing_rect_height="250dp" app:qrcv_animTime="1000" app:qrcv_borderColor="#00000000" app:qrcv_borderSize="1dp" app:qrcv_cornerColor="#ffffff" app:qrcv_cornerLength="20dp" app:qrcv_cornerSize="3dp" app:qrcv_maskColor="#33FFFFFF" app:qrcv_rectWidth="220dp" app:qrcv_scanLineColor="#ffffff" app:qrcv_scanLineSize="1dp" app:qrcv_topOffset="100dp" /> <com.ljm.zxing.ScanView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/zxing_viewfinder_view" app:zxing_possible_result_points="@color/zxing_custom_possible_result_points" app:zxing_result_view="@color/zxing_custom_result_view" app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser" app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask"/> <TextView android:id="@+id/zxing_status_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" android:background="@color/zxing_transparent" android:text="@string/zxing_msg_default_status" android:textColor="@color/zxing_status_text"/>merge>
com.ljm.zxing.ScanView是自定义控件,控制扫描框,扫描线等样式
(4)ScanView代码
package com.ljm.zxing;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import com.journeyapps.barcodescanner.CameraPreview;import com.journeyapps.barcodescanner.ViewfinderView;/** * Created by BettyLi on 2018/3/22. * 重写ViewfinderView设置扫描框的样式,四个角和扫描线样式 */public class ScanView extends ViewfinderView { protected static final int CURRENT_POINT_OPACITY = 0xA0; protected Bitmap resultBitmap; protected final Paint paint; protected CameraPreview cameraPreview; protected Rect framingRect; protected Rect previewFramingRect; private int i=0; private int ScreenRate; /** * 四个绿色边角对应的宽度 */ private static final int CORNER_WIDTH = 10; /** * 手机的屏幕密度 */ private static float density; public ScanView(Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(Paint.ANTI_ALIAS_FLAG); //四个绿色边角 density = context.getResources().getDisplayMetrics().density; //将像素转换成dp ScreenRate = (int)(20 * density); } public void setCameraPreview(CameraPreview view) { this.cameraPreview = view; view.addStateListener(new CameraPreview.StateListener() { @Override public void previewSized() { refreshSizes(); invalidate(); } @Override public void previewStarted() { } @Override public void previewStopped() { } @Override public void cameraError(Exception error) { } @Override public void cameraClosed() { } }); } protected void refreshSizes() { if(cameraPreview == null) { return; } Rect framingRect = cameraPreview.getFramingRect(); Rect previewFramingRect = cameraPreview.getPreviewFramingRect(); if(framingRect != null && previewFramingRect != null) { this.framingRect = framingRect; this.previewFramingRect = previewFramingRect; } } @SuppressLint("DrawAllocation") @Override public void onDraw(Canvas canvas) { refreshSizes(); if (framingRect == null || previewFramingRect == null) { return; } Rect frame = framingRect; int width = canvas.getWidth(); int height = canvas.getHeight(); paint.setColor(resultBitmap != null ? resultColor : maskColor); canvas.drawRect(0, 0, width, frame.top, paint); canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint); canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint); canvas.drawRect(0, frame.bottom + 1, width, height, paint); if (resultBitmap != null) { paint.setAlpha(CURRENT_POINT_OPACITY); canvas.drawBitmap(resultBitmap, null, frame, paint); }else{ drawFrameCorner(canvas, frame); drawLaserLine(canvas, frame);//绘制扫描线 } } /** * 画扫描线 * * @param canvas * @param frame */ private void drawLaserLine(Canvas canvas, Rect frame) { if ((i += 5) < frame.bottom - frame.top) { } else { i = 0; } paint.setStyle(Paint.Style.FILL); paint.setColor(Color.GREEN);// 设置扫描线颜色 canvas.drawRect(frame.left - 1, frame.top + i - 1, frame.right + 1,frame.top + 1 + i, paint); // 刷新 invalidate(); } /** * 绘制扫描框4角 * * @param canvas * @param frame */ private void drawFrameCorner(Canvas canvas, Rect frame) { //画扫描框边上的角,总共8个部分 paint.setColor(Color.GREEN); canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate, frame.top + CORNER_WIDTH, paint); canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top + ScreenRate, paint); canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right, frame.top + CORNER_WIDTH, paint); canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top + ScreenRate, paint); canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left + ScreenRate, frame.bottom, paint); canvas.drawRect(frame.left, frame.bottom - ScreenRate, frame.left + CORNER_WIDTH, frame.bottom, paint); canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH, frame.right, frame.bottom, paint); canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate, frame.right, frame.bottom, paint); } public void drawViewfinder() { Bitmap resultBitmap = this.resultBitmap; this.resultBitmap = null; if (resultBitmap != null) { resultBitmap.recycle(); } invalidate(); } public void drawResultBitmap(Bitmap result) { resultBitmap = result; invalidate(); }}
源码地址https://download.csdn.net/download/qq_24349695/10302772
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 自动代码规范检查工具Checkstyle
- android 中的PopupWindow 弹出菜单
- Android(安卓)NDK开发 native层获取Surface并显示图像 思路过程
- android中使用代码启动其他程序
- 【Android(安卓)开发教程】自定义服务
- Android(安卓)读取excel (支持 xls和xlsx)
- android 数字进度条--NumberProgressBar
- 《Beginning Android(安卓)Games》给出基本框架的实现(1)