You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android应用的Fragment中集成Google条码扫描功能

在Fragment中集成Google ML Kit条码扫描的实现方案

前置配置

  • 开启Java 8编译支持,在app模块build.gradle的android节点中添加:
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
  • 在app模块build.gradle中添加条码扫描依赖:
dependencies {
    // 条码扫描核心依赖
    implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0'
    // 如果需要将识别模型打包到APK,无需首次使用时下载,添加以下依赖
    implementation 'com.google.mlkit:barcode-scanning:17.2.0'
}
  • 在AndroidManifest.xml中添加必要权限和硬件声明:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.any" />

完整修改后的GalleryFragment代码

package com.example.navbartrack.ui.gallery;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;

import com.example.navbartrack.R;
import com.google.mlkit.vision.barcode.BarcodeScanner;
import com.google.mlkit.vision.barcode.BarcodeScanning;
import com.google.mlkit.vision.barcode.common.Barcode;
import com.google.mlkit.vision.camera.CameraSourceConfig;
import com.google.mlkit.vision.camera.CameraXSource;
import com.google.mlkit.vision.camera.DetectionTaskCallback;

public class GalleryFragment extends Fragment {

    private GalleryViewModel galleryViewModel;
    private Button scan_btn;
    private static final int PERMISSION_REQUEST_CAMERA = 1001;
    private CameraXSource cameraXSource;
    private BarcodeScanner barcodeScanner;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        galleryViewModel =
                new ViewModelProvider(this).get(GalleryViewModel.class);
        View root = inflater.inflate(R.layout.fragment_gallery, container, false);

        // 初始化条码扫描器
        barcodeScanner = BarcodeScanning.getClient();

        scan_btn = root.findViewById(R.id.btn_scan);
        scan_btn.setOnClickListener(view -> {
            // 先检查相机权限
            if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA)
                    == PackageManager.PERMISSION_GRANTED) {
                startBarcodeScanning();
            } else {
                // 申请相机权限
                requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA);
            }
        });

        return root;
    }

    // 权限申请结果回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CAMERA) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startBarcodeScanning();
            } else {
                Toast.makeText(requireContext(), "需要相机权限才能进行条码扫描", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * 启动条码扫描
     */
    private void startBarcodeScanning() {
        // 配置识别回调
        DetectionTaskCallback<Barcode> detectionTaskCallback = detectionTask ->
                detectionTask.addOnSuccessListener(barcodes -> {
                    // 识别成功,处理返回的条码结果
                    for (Barcode barcode : barcodes) {
                        String scanResult = barcode.getRawValue();
                        Toast.makeText(requireContext(), "扫描结果:" + scanResult, Toast.LENGTH_SHORT).show();
                        // 识别到结果后停止相机
                        if (cameraXSource != null) {
                            cameraXSource.close();
                        }
                        // 此处可添加自定义的结果处理逻辑
                    }
                }).addOnFailureListener(e -> {
                    Toast.makeText(requireContext(), "扫描失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    if (cameraXSource != null) {
                        cameraXSource.close();
                    }
                });

        // 配置相机源
        CameraSourceConfig config = new CameraSourceConfig.Builder(requireContext(), barcodeScanner, detectionTaskCallback)
                .setFacing(CameraSourceConfig.CAMERA_FACING_BACK)
                .setRequestedPreviewSize(1280, 720)
                .build();

        cameraXSource = new CameraXSource(config);
        // 启动相机预览,你也可以将预览绑定到自定义布局的PreviewView组件,实现自定义扫描UI
        cameraXSource.start();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        // 页面销毁时释放资源
        if (barcodeScanner != null) {
            barcodeScanner.close();
        }
        if (cameraXSource != null) {
            cameraXSource.close();
        }
    }
}

可选优化项

可以通过BarcodeScannerOptions配置只识别指定的条码格式,减少不必要的性能消耗:

BarcodeScannerOptions options = new BarcodeScannerOptions.Builder()
        .setBarcodeFormats(
                Barcode.FORMAT_QR_CODE, // 仅识别二维码
                Barcode.FORMAT_EAN_13) // 仅识别EAN13格式商品码
        .build();
BarcodeScanner scanner = BarcodeScanning.getClient(options);

内容的提问来源于stack exchange,提问作者Valerio Jiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:06:08