使用ZXing进行二维码和条形码扫描

幽灵探险家 2022-04-28T19:45:57+08:00
0 0 219

二维码和条形码扫描在如今的移动应用中被广泛使用,无论是商业应用还是个人应用,它们都能为用户提供便利。在安卓开发中,ZXing是一个功能强大而又易于使用的库,可以帮助我们实现二维码和条形码的扫描功能。本文将介绍如何使用ZXing库进行二维码和条形码的扫描。

1. 引入ZXing库

首先,在你的Android Studio项目中,找到build.gradle(Module: app)文件,然后在dependencies块中添加以下代码:

implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:4.0.0'

这将会引入ZXing库以及用于在Android应用中嵌入ZXing库的依赖。

2. 创建扫描活动

创建一个新的活动用于扫描二维码和条形码,例如命名为ScanActivity.java

在该活动中,你需要添加一个SurfaceView用于相机预览,并且初始化ZXing扫描器。同时,还要添加一个用于显示扫描结果的TextView。

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
import com.journeyapps.barcodescanner.DefaultDecoderFactory;

import java.util.Arrays;
import java.util.Collection;

public class ScanActivity extends AppCompatActivity {

    private static final int CAMERA_PERMISSION_REQUEST_CODE = 200;
    private static final int CAMERA_REQUEST_CODE = 201;

    private DecoratedBarcodeView barcodeView;
    private TextView resultTextView;

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

        barcodeView = findViewById(R.id.barcode_view);
        resultTextView = findViewById(R.id.result_text_view);
        
        // 初始化ZXing扫描器
        Collection<BarcodeFormat> formats = Arrays.asList(BarcodeFormat.QR_CODE, BarcodeFormat.CODE_128);
        barcodeView.getBarcodeView().setDecoderFactory(new DefaultDecoderFactory(formats));

        // 请求相机权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    CAMERA_PERMISSION_REQUEST_CODE);
        } else {
            startCamera();
        }
    }

    private void startCamera() {
        barcodeView.resume();
        barcodeView.decodeSingle(new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                barcodeView.pause();
                String barcode = result.getText();
                resultTextView.setText(barcode);
            }

            @Override
            public void possibleResultPoints(List<ResultPoint> resultPoints) {}
        });
    }

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

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            startCamera();
        }
    }

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

        barcodeView.pause();
    }

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

        barcodeView.pause();
        barcodeView.shutdown();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startCamera();
            }
        }
    }
}

3. 创建布局文件

res/layout目录下创建一个名为activity_scan.xml的布局文件,用于定义扫描活动的UI。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ScanActivity">

    <com.journeyapps.barcodescanner.DecoratedBarcodeView
        android:id="@+id/barcode_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/result_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="24sp"
        android:textColor="#000000" />

</RelativeLayout>

这个布局文件中包含一个用于相机预览的DecoratedBarcodeView和一个用于显示扫描结果的TextView。

4. 配置Manifest文件

AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />

同时,在<application>标签内添加ScanActivity活动的声明:

<activity android:name=".ScanActivity" />

5. 运行

至此,你已经完成了使用ZXing进行二维码和条形码扫描的代码编写。现在,运行你的应用程序,并通过扫描二维码或条形码测试你的扫描功能。

结论

本文介绍了如何使用ZXing库进行安卓开发中的二维码和条形码扫描。通过ZXing,你可以轻松实现扫描功能,并将扫描结果用于其他业务逻辑。因其强大而易于使用,ZXing已成为许多开发者首选的扫描库。希望本文对你有所帮助,谢谢阅读!

相似文章

    评论 (0)