如何在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
相关产品推荐
相关产品推荐

