📜  如何在Android中使用Zxing库读取QR码?(1)

📅  最后修改于: 2023-12-03 15:38:30.308000             🧑  作者: Mango

如何在Android中使用Zxing库读取QR码?

QR码是一种二维码,被广泛应用于各个领域,如支付、物流、活动等。在Android应用开发中,我们常常需要使用二维码扫描功能来实现某些功能。Zxing库是一个流行的二维码扫描库,他可以在Android应用程序中很容易地集成。

引入Zxing库

首先需要在项目的build.gradle文件中添加Zxing库的依赖:

    implementation 'com.google.zxing:core:3.3.3'
    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
实现二维码扫描
在activity中布局界面

打开布局xml文件,在其中添加一个SurfaceView用于预览相机画面以及一个Button用于触发扫描。具体实现如下:

    <SurfaceView
        android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/btn_scan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="扫描二维码"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"/>
初始化Zxing库

然后在activity中找到对应的SurfaceViewButton,并初始化Zxing库,具体代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener, ZXingScannerView.ResultHandler {

    private static final int PERMISSION_CODE_CAMERA = 1001;
    private ZXingScannerView mScannerView;
    private Button mBtnScan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化扫描器View
        mScannerView = new ZXingScannerView(this);
        FrameLayout frameLayout = findViewById(R.id.fl_scan_frame);
        frameLayout.addView(mScannerView);

        // 找到扫描按钮并设置监听器
        mBtnScan = findViewById(R.id.btn_scan);
        mBtnScan.setOnClickListener(this);
    }
}
获取相机权限

在Android6.0及以上版本,需要在运行时获取相机权限。在activity的onCreate方法中,检查应用是否被授予相机权限,在没有授权时向用户申请权限:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 检查是否被授权使用相机
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        // 申请权限
        ActivityCompat.requestPermissions(
                this,
                new String[]{Manifest.permission.CAMERA},
                PERMISSION_CODE_CAMERA);
        return;
    }

    // 初始化扫描器View
    mScannerView = new ZXingScannerView(this);
    FrameLayout frameLayout = findViewById(R.id.fl_scan_frame);
    frameLayout.addView(mScannerView);

    // 找到扫描按钮并设置监听器
    mBtnScan = findViewById(R.id.btn_scan);
    mBtnScan.setOnClickListener(this);
}

当用户同意或拒绝授权时,调用onRequestPermissionsResult方法:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    // 处理相机权限授权结果
    if (requestCode == PERMISSION_CODE_CAMERA) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 已授权
            // 初始化扫描器View
            mScannerView = new ZXingScannerView(this);
            FrameLayout frameLayout = findViewById(R.id.fl_scan_frame);
            frameLayout.addView(mScannerView);

            // 找到扫描按钮并设置监听器
            mBtnScan = findViewById(R.id.btn_scan);
            mBtnScan.setOnClickListener(this);
        } else {
            // 拒绝权限
            Toast.makeText(this, "相机权限被拒绝,请授予权限后再使用", Toast.LENGTH_SHORT).show();
        }
    }
}
启动扫描器

启动扫描器需要在onResume方法中调用mScannerView.setResultHandler方法并传递MainActivity对象,然后调用mScannerView.startCamera()方法。

@Override
protected void onResume() {
    super.onResume();

    // 设置处理结果的handler,并启动相机预览
    mScannerView.setResultHandler(this);
    mScannerView.startCamera();
}
处理扫描结果

当扫描器识别到二维码时,调用handleResult方法处理扫描结果。

@Override
public void handleResult(Result rawResult) {
    // 停止预览
    mScannerView.stopCamera();

    // 显示扫描结果
    Toast.makeText(this, rawResult.getText(), Toast.LENGTH_SHORT).show();

    // 重新开始预览
    mScannerView.startCamera();
}
停止扫描器

在activity的onPause方法中调用mScannerView.stopCamera()方法停止相机预览。

@Override
protected void onPause() {
    super.onPause();

    // 关闭相机预览
    mScannerView.stopCamera();
}

到此为止,我们已经完成了二维码扫描的实现。

总结

总的来说,使用Zxing库实现二维码扫描非常容易。开发人员只需要引入库,然后按照上述步骤实现相关功能即可。