一、环境依赖
IDE:Android Studio
版本管理:gradle
依赖

implementation 'com.journeyapps:zxing-android-embedded:3.3.0'
implementation 'com.google.zxing:core:3.2.1'

二、构建扫码Activity
创建个Activity

package com.tmri.license.activity;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import com.tmri.license.R;

/**
 * 摄像头
 */
public class CustomScanActivity extends Activity implements DecoratedBarcodeView.TorchListener {

    Button swichLight;
    DecoratedBarcodeView mDBV;

    private CaptureManager captureManager;
    private boolean isLightOn = false;

    @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 mDBV.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature( Window.FEATURE_NO_TITLE);//去掉标题栏
        setContentView( R.layout.activity_custom_scan);

        swichLight = (Button) findViewById( R.id.btn_switch );
        mDBV = (DecoratedBarcodeView) findViewById( R.id.dbv_custom );
        mDBV.setTorchListener(this);

        // 如果没有闪光灯功能,就去掉相关按钮
        if(!hasFlash()) {
            swichLight.setVisibility(View.GONE);
        }else{
            swichLight.setOnClickListener( new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(isLightOn){
                        mDBV.setTorchOff();
                    }else{
                        mDBV.setTorchOn();
                    }
                }
            } );
        }

        //重要代码,初始化捕获
        captureManager = new CaptureManager(this,mDBV);
        captureManager.initializeFromIntent(getIntent(),savedInstanceState);
        captureManager.decode();
    }

    // torch 手电筒
    @Override
    public void onTorchOn() {
        Toast.makeText(this,"torch on",Toast.LENGTH_LONG).show();
        isLightOn = true;
    }

    @Override
    public void onTorchOff() {
        Toast.makeText(this,"torch off", Toast.LENGTH_LONG).show();
        isLightOn = false;
    }

    // 判断是否有闪光灯功能
    private boolean hasFlash() {
        return getApplicationContext().getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    }

}

扫码界面代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:background="#05000000"
    tools:context="com.tmri.license.activity.CustomScanActivity">

    <!-- 我这里只是在大局下修改了一些样式,不过其实 扫描框中的 各种激光条,边框都可以改变,有兴趣的同学可以自己去搜一下 -->
    <!-- 这个控件就是扫描的窗口了 -->
    <com.journeyapps.barcodescanner.DecoratedBarcodeView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/dbv_custom"
        android:layout_gravity="center"
        android:gravity="center"
        app:zxing_framing_rect_width="250dp"
        app:zxing_framing_rect_height="250dp"
        app:zxing_preview_scaling_strategy="fitXY"
        app:zxing_use_texture_view="true"
        >
    </com.journeyapps.barcodescanner.DecoratedBarcodeView>

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:columnCount="1"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_switch"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="center"
            android:layout_marginTop="350dp"
            android:background="@drawable/sdt" />

    </GridLayout>

</RelativeLayout>

三、调用
调用出扫码界面

public void customScan(){
        new IntentIntegrator(MainActivity.this)
                        .setOrientationLocked(false)
                        .setCaptureActivity(CustomScanActivity.class) // 设置自定义的activity是CustomActivity
                        .initiateScan(); // 初始化扫描
}

返回扫码结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        try {
                // 扫描二维码/条码回传 requestCode == REQUEST_CODE_SCAN &&
                if (resultCode == RESULT_OK) {

                        //如果二维码是byte数组格式,这样获取
                        byte[] bytes = data.getByteArrayExtra("SCAN_RESULT_BYTE_SEGMENTS_0");

                        //如果是文本格式如下获取
                        IntentResult intentResult = IntentIntegrator.parseActivityResult( requestCode, resultCode, data );
                        if(intentResult != null) {
                                if(intentResult.getContents() == null) {
                                        Toast.makeText(MainActivity.this,"内容为空",Toast.LENGTH_LONG).show();
                                } else {
                                        // ScanResult 为 获取到的字符串
                                        String scanResult = intentResult.getContents();
                                }
                        }
                }

        } catch (Exception e){
                Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGTH_LONG).show();
        }

}