📜  Android QR码条形码扫描(1)

📅  最后修改于: 2023-12-03 14:59:15.279000             🧑  作者: Mango

Android QR码条形码扫描

简介

QR码和条形码是现代数字世界中十分常见的编码方式,它们广泛应用于商品条码、物流标签、票据、二维码等等。在Android开发中,我们可以通过使用相机来实现扫描扫描二维码或条形码。

本文将介绍如何在Android应用中集成QR码和条形码的扫描功能,并且展示如何解析扫描得到的二维码或条形码信息。

扫描库选择

在集成QR码和条形码扫描功能之前,我们首先需要选择一个扫描库。这里我们推荐使用Google开源的Barcode Scanning API。这个库可以快速便捷地集成扫描功能,并且支持多种类型的二维码和条形码。

集成
步骤一:添加依赖

build.gradle 文件中添加以下依赖:

dependencies {
    // ...
    implementation 'com.google.mlkit:barcode-scanning:17.1.1'
}
步骤二:请求相机权限

在使用相机进行扫描之前,我们需要请求相机权限。添加以下代码在应用程序运行时请求相机权限:

private static final int PERMISSION_CAMERA = 1;

private void requestCameraPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA);
    } else {
        startScanning(); // 相机权限已授权 直接开始扫描
    }
}

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

    if (requestCode == PERMISSION_CAMERA) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startScanning(); // 已授权 开始扫描
        } else {
            // 拒绝授权
            Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();
        }
    }
}
步骤三:创建扫描界面

我们需要创建一个布局文件作为扫描界面。这里使用一个 SurfaceView 来显示相机画面:

<SurfaceView
    android:id="@+id/surface_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
步骤四:开始扫描

创建 BarcodeScanner 对象,并在 SurfaceView 上进行初始化:

private SurfaceView surfaceView;
private BarcodeScanner scanner;
private boolean isScanning = false;

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

    surfaceView = findViewById(R.id.surface_view);

    startCameraPreview();
}

private void startCameraPreview() {
    scanner = BarcodeScanning.getClient();

    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                scanner.startScan(holder);
                isScanning = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            scanner.stopScan();
            isScanning = false;
        }
    });
}

在正式开始扫描之前,请确保相机权限已经被授权。

步骤五:解析扫描结果

无论是QR码还是条形码,我们都可以通过 Barcode 对象来解析扫描结果:

private void processScanningResult(List<Barcode> barcodes) {
    if (barcodes == null || barcodes.size() == 0) {
        Toast.makeText(this, "No barcodes detected", Toast.LENGTH_SHORT).show();
        return;
    }

    for (Barcode barcode : barcodes) {
        int valueType = barcode.getValueType();
        switch (valueType) {
            case Barcode.TYPE_URL:
                String title = barcode.getTitle();
                String url = barcode.getUrl().getUrl();
                Log.d("BARCODE INFO", "title: " + title + ", url: " + url);
                break;
            case Barcode.TYPE_PHONE:
                String phoneNumber = barcode.getPhone().getNumber();
                Log.d("BARCODE INFO", "phone number: " + phoneNumber);
                break;
            case Barcode.TYPE_EMAIL:
                String address = barcode.getEmail().getAddress();
                String subject = barcode.getEmail().getSubject();
                String body = barcode.getEmail().getBody();
                Log.d("BARCODE INFO", "address: " + address + ", subject: " + subject + ", body: " + body);
                break;
            // 其他类型
            default:
                String value = barcode.getRawValue();
                Log.d("BARCODE INFO", "value: " + value);
                break;
        }
    }
}
结论

集成QR码和条形码扫描功能,对于很多需要用户输入信息的应用程序有很好的用户体验。而Google提供的Barcode Scanning API是一款好用实用的库,既支持QR码和条形码,也支持多种类型的条形码识别。将此库与自己的应用程序结合使用,可以快速、稳定地获得二维码和条形码扫描功能。