项目需要,只有单纯的二维码扫描识别,没有二维码的生成。
网上有很多教程,所以有借鉴其他人的代码,只是单纯记录一下~~
在build.gradle里面加入:
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
首先在布局文件中添加按钮,然后对按钮添加点击事件
btBarcode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new IntentIntegrator(getActivity())
.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES)// 扫码的类型,可选:一维码,二维码,一/二维码
.setPrompt("请对准二维码")// 设置提示语
.setCameraId(0)// 选择摄像头,可使用前置或者后置
.setBeepEnabled(true)// 是否开启声音,扫完码之后会"哔"的一声
.setCaptureActivity(CaptureActivity.class)//默认扫码界面(横屏)
.initiateScan();// 初始化扫码
}
});
然后在MainActivity.java里面重写onActivityResult函数,处理二维码扫描结果
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
/**
* 处理二维码扫描结果
*/
//扫码结果
IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (intentResult != null) {
if (intentResult.getContents() == null) {
//扫码失败
Toast.makeText(MainActivity.this, "扫码失败" , Toast.LENGTH_LONG).show();
} else {
String result = intentResult.getContents();//返回值
Toast.makeText(MainActivity.this, "扫码结果:" + result, Toast.LENGTH_LONG).show();
}
}
}
然后就可以简单实现二维码扫描并返回结果了。
但是自带的扫描框是横向的,而且没有边框之类的,可以自定义一个
添加一个CustomZxingView用于绘制自定义的扫描框
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Rect;
import android.graphics.Shader;
import android.util.AttributeSet;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.ViewfinderView;
import java.util.ArrayList;
import java.util.List;
public class CustomZxingView extends ViewfinderView {
public int laserLinePosition = 0;
public float[] position = new float[]{0f, 0.5f, 1f};
public int[] colors = new int[]{0xff0699e6, 0xff0699e6, 0xff0699e6};
public LinearGradient linearGradient;
public CustomZxingView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 重写draw方法绘制自己的扫描框
*
* @param canvas
*/
@Override
public void onDraw(Canvas canvas) {
refreshSizes();
if (framingRect == null || previewFramingRect == null) {
return;
}
Rect frame = framingRect;
Rect previewFrame = previewFramingRect;
int width = canvas.getWidth();
int height = canvas.getHeight();
//绘制4个角
paint.setColor(Color.parseColor("#139D57"));//定义画笔的颜色
canvas.drawRect(frame.left, frame.top, frame.left + 100, frame.top + 10, paint);
canvas.drawRect(frame.left, frame.top, frame.left + 10, frame.top + 100, paint);
canvas.drawRect(frame.right - 100, frame.top, frame.right, frame.top + 10, paint);
canvas.drawRect(frame.right - 10, frame.top, frame.right, frame.top + 100, paint);
canvas.drawRect(frame.left, frame.bottom - 10, frame.left + 100, frame.bottom, paint);
canvas.drawRect(frame.left, frame.bottom - 100, frame.left + 10, frame.bottom, paint);
canvas.drawRect(frame.right - 100, frame.bottom - 10, frame.right, frame.bottom, paint);
canvas.drawRect(frame.right - 10, frame.bottom - 100, frame.right, frame.bottom, paint);
// Draw the exterior (i.e. outside the framing rect) darkened
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) {
// Draw the opaque result bitmap over the scanning rectangle
paint.setAlpha(CURRENT_POINT_OPACITY);
canvas.drawBitmap(resultBitmap, null, frame, paint);
} else {
int middle = frame.height() / 2 + frame.top;
laserLinePosition = laserLinePosition + 5;
if (laserLinePosition > frame.height()) {
laserLinePosition = 0;
}
linearGradient = new LinearGradient(frame.left + 1, frame.top + laserLinePosition, frame.right - 1, frame.top + 10 + laserLinePosition, colors, position, Shader.TileMode.CLAMP);
// Draw a red "laser scanner" line through the middle to show decoding is active
paint.setShader(linearGradient);
//绘制扫描线
canvas.drawRect(frame.left + 1, frame.top + laserLinePosition, frame.right - 1, frame.top + 10 + laserLinePosition, paint);
paint.setShader(null);
float scaleX = frame.width() / (float) previewFrame.width();
float scaleY = frame.height() / (float) previewFrame.height();
List<ResultPoint> currentPossible = possibleResultPoints;
List<ResultPoint> currentLast = lastPossibleResultPoints;
int frameLeft = frame.left;
int frameTop = frame.top;
if (currentPossible.isEmpty()) {
lastPossibleResultPoints = null;
} else {
possibleResultPoints = new ArrayList<>(5);
lastPossibleResultPoints = currentPossible;
paint.setAlpha(CURRENT_POINT_OPACITY);
paint.setColor(resultPointColor);
for (ResultPoint point : currentPossible) {
canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX),
frameTop + (int) (point.getY() * scaleY),
POINT_SIZE, paint);
}
}
if (currentLast != null) {
paint.setAlpha(CURRENT_POINT_OPACITY / 2);
paint.setColor(resultPointColor);
float radius = POINT_SIZE / 2.0f;
for (ResultPoint point : currentLast) {
canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX),
frameTop + (int) (point.getY() * scaleY),
radius, paint);
}
}
postInvalidateDelayed(16,
frame.left,
frame.top,
frame.right,
frame.bottom);
}
}
}
QrCodeActivity.java
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import cn.edu.whu.bdmobile.R;
public class QrCodeActivity extends AppCompatActivity implements DecoratedBarcodeView.TorchListener {
private DecoratedBarcodeView decoratedBarcodeView;
private CaptureManager captureManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qr_code);
decoratedBarcodeView=this.findViewById(R.id.decoratedBarcodeView);
//重要代码,初始化捕获
captureManager = new CaptureManager(this, decoratedBarcodeView);
captureManager.initializeFromIntent(getIntent(), savedInstanceState);
captureManager.decode();
decoratedBarcodeView.setTorchListener(this);
}
@Override
public void onTorchOn() {
}
@Override
public void onTorchOff() {
}
@Override
protected void onPause() {
super.onPause();
captureManager.onPause();
}
@Override
protected void onResume() {
super.onResume();
captureManager.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
captureManager.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
captureManager.onSaveInstanceState(outState);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return decoratedBarcodeView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
}
新增两个布局文件
activity_qr_code.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/decoratedBarcodeView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:zxing_framing_rect_height="250dp"
app:zxing_framing_rect_width="250dp"
app:zxing_preview_scaling_strategy="fitXY"
app:zxing_scanner_layout="@layout/layout_zxing"
app:zxing_use_texture_view="true" />
</LinearLayout>
layout_zxing.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.journeyapps.barcodescanner.BarcodeView
android:id="@+id/zxing_barcode_surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:zxing_framing_rect_height="300dp"
app:zxing_framing_rect_width="300dp" />
<cn.edu.whu.bdmobile.ui.view.CustomZxingView
android:id="@+id/zxing_viewfinder_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:zxing_possible_result_points="#139D57"
app:zxing_result_view="@color/zxing_custom_result_view"
app:zxing_viewfinder_laser="#fff"
app:zxing_viewfinder_mask="#60000000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="20dp"
android:text="请对准二维码开始扫描"
android:textColor="#fff" />
</merge>
最后修改按钮点击事件,将CaptureActivity换成QrCodeActivity即可
btBarcode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new IntentIntegrator(getActivity())
.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES)// 扫码的类型,可选:一维码,二维码,一/二维码
.setPrompt("请对准二维码")// 设置提示语
.setCameraId(0)// 选择摄像头,可使用前置或者后置
.setBeepEnabled(true)// 是否开启声音,扫完码之后会"哔"的一声
//.setCaptureActivity(CaptureActivity.class)//默认扫码界面(横屏)
.setCaptureActivity(QrCodeActivity.class)//自定义扫码界面
.initiateScan();// 初始化扫码
}
});