1、引入
implementation 'com.journeyapps:zxing-android-embedded:3.5.0'
2、使用:
-
public void initScan() {
-
IntentIntegrator integrator =
new IntentIntegrator(
this);
-
// 设置要扫描的条码类型,ONE_D_CODE_TYPES:一维码,QR_CODE_TYPES-二维码
-
integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES);
-
integrator.setCaptureActivity(ScanActivity.class); //设置打开摄像头的Activity
-
integrator.setPrompt(""); //底部的提示文字,设为""可以置空
-
integrator.setCameraId(
0);
//前置或者后置摄像头
-
integrator.setBeepEnabled(
true);
//扫描成功的「哔哔」声,默认开启
-
integrator.setBarcodeImageEnabled(
true);
-
integrator.initiateScan();
-
}
-
-
@Override
-
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
-
super.onActivityResult(requestCode, resultCode, intent);
-
if (requestCode == IntentIntegrator.REQUEST_CODE) {
-
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
-
if (scanResult !=
null && scanResult.getContents() !=
null) {
-
String result = scanResult.getContents();
-
LogUtil.d(
"扫码返回: " + result);
-
try {
-
JSONObject jsonObject =
new JSONObject(result);
-
if (jsonObject.has(Constant.USERPOLICEMENID)) {
-
//TODO 逻辑
-
-
}
else {
-
ToastUtil.showShortToast(
"未扫描到有效的信息");
-
}
-
}
catch (Exception e) {
-
ToastUtil.showShortToast(
"未扫描到有效的信息");
-
e.printStackTrace();
-
}
-
}
else {
-
ToastUtil.showShortToast(
"未扫描到有效的信息");
-
}
-
}
-
}
3、ScanActivity
-
public
class ScanActivity extends BackActivity {
-
-
@BindView(R.id.dbv)
-
DecoratedBarcodeView mDbv;
-
private CaptureManager captureManager;
-
-
@Override
-
protected int getLayoutId() {
-
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
-
return R.layout.activity_scan;
-
}
-
-
@Override
-
protected void init() {
-
super.init();
-
captureManager =
new CaptureManager(
this, mDbv);
-
captureManager.initializeFromIntent(getIntent(), getSavedInstanceState());
-
captureManager.decode();
-
}
-
-
@Override
-
public void onSaveInstanceState(@NotNull Bundle outState, @NotNull PersistableBundle outPersistentState) {
-
super.onSaveInstanceState(outState, outPersistentState);
-
captureManager.onSaveInstanceState(outState);
-
}
-
-
@Override
-
public boolean onKeyDown(int keyCode, KeyEvent event) {
-
return mDbv.onKeyDown(keyCode, event) ||
super.onKeyDown(keyCode, event);
-
}
-
-
@Override
-
protected void onPause() {
-
super.onPause();
-
captureManager.onPause();
-
}
-
-
@Override
-
public void onResume() {
-
super.onResume();
-
captureManager.onResume();
-
}
-
-
@Override
-
protected void onDestroy() {
-
super.onDestroy();
-
captureManager.onDestroy();
-
}
-
-
}
4、布局文件
activity_scan
-
<?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"
-
xmlns:tools=
"http://schemas.android.com/tools"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"match_parent"
-
android:orientation=
"vertical"
-
tools:context=
".ui.main.alarmassistant.ScanActivity">
-
-
-
<com.journeyapps.barcodescanner.DecoratedBarcodeView
-
android:id=
"@+id/dbv"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"match_parent"
-
android:fitsSystemWindows=
"true"
-
app:zxing_framing_rect_height=
"200dp"
-
app:zxing_framing_rect_width=
"200dp"
-
app:zxing_preview_scaling_strategy=
"fitXY"
-
app:zxing_scanner_layout=
"@layout/view_qr"
-
app:zxing_use_texture_view=
"true" />
-
</LinearLayout>
view_qr
-
<?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=
"50dp"
-
app:zxing_framing_rect_width=
"250dp" />
-
-
<com.x.x.widget.QrView
-
android:id=
"@+id/zxing_viewfinder_view"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"match_parent"
-
app:zxing_possible_result_points=
"@color/color_white"
-
app:zxing_result_view=
"@color/zxing_custom_result_view"
-
app:zxing_viewfinder_laser=
"@color/color_white"
-
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:layout_marginBottom=
"30dp"
-
android:background=
"@color/zxing_transparent"
-
android:text=
"@string/zxing_msg_default_status"
-
android:textColor=
"@color/zxing_status_text" />
-
-
<com.x.common.widget.MyActionBar
-
android:id=
"@+id/action_bar"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
app:dark_mode=
"true"
-
app:title=
"扫一扫" />
-
</merge>
5、
-
/**
-
* 自定义扫描界面
-
*/
-
-
public
class QrView extends ViewfinderView {
-
-
public
int laserLinePosition =
0;
-
public
float[] position =
new
float[]{
0f,
0.5f,
1f};
-
public
int[] colors =
new
int[]{
0x0027B14D,
0xff27B14D,
0x0027B14D};
-
public LinearGradient linearGradient;
-
private
int ScreenRate;
-
-
public QrView(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
float density = context.getResources().getDisplayMetrics().density;
-
ScreenRate = (
int) (
15 * density);
-
}
-
-
@Override
-
public void onDraw(Canvas canvas) {
-
int CORNER_WIDTH =
15;
-
refreshSizes();
-
-
if (framingRect ==
null || previewFramingRect ==
null) {
-
return;
-
}
-
-
Rect frame = framingRect;
-
Rect previewFrame = previewFramingRect;
-
-
int width = canvas.getWidth();
-
int height = canvas.getHeight();
-
//绘制4个角
-
-
paint.setColor(getResources().getColor(R.color.color_white));
//定义画笔的颜色
-
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);
-
-
// 画出外部(即构图矩形之外)变暗
-
paint.setColor(resultBitmap !=
null ? resultColor : maskColor);
-
canvas.drawRect(
0,
0, width, frame.top, paint);
-
canvas.drawRect(
0, frame.top, frame.left, frame.bottom, paint);
-
canvas.drawRect(frame.right, frame.top, width, frame.bottom, paint);
-
canvas.drawRect(
0, frame.bottom, 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 {
-
-
laserLinePosition = laserLinePosition +
8;
-
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);
-
}
-
}
-
}
-
转载:https://blog.csdn.net/baidu_24743861/article/details/117388319
查看评论