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

二维码扫描功能从Mobile Vision迁移到ML Kit后无法识别QR码问题求助

ML Kit二维码扫描无回调/Task未完成报错修复方案

核心问题排查点

  • 动态相机权限缺失:Android 6.0及以上系统仅在Manifest声明相机权限无效,必须先动态申请CAMERA权限并获得用户授权后,再初始化扫描逻辑,否则识别流程会静默失败不触发回调。
  • 无异常捕获逻辑:当前代码仅处理了task执行成功的分支,没有补充失败分支的异常捕获,无法定位识别流程中出现的具体错误。
  • 依赖导入不完整:若仅导入二维码识别核心包,未导入ML Kit配套的CameraX相关依赖,也会导致识别流程卡住。

修复后的完整代码

import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;

import com.google.mlkit.vision.barcode.Barcode;
import com.google.mlkit.vision.barcode.BarcodeScanner;
import com.google.mlkit.vision.barcode.BarcodeScannerOptions;
import com.google.mlkit.vision.barcode.BarcodeScanning;
import com.google.mlkit.vision.camera.CameraSourceConfig;
import com.google.mlkit.vision.camera.CameraXSource;

import java.util.List;

public class ScanQRcodeActivity extends AppCompatActivity {

    private CameraXSource cameraXSource;
    private static final int PERMISSION_REQUEST_CAMERA = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_q_rcode);
        
        // 先检查相机权限
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            // 没有权限则申请
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.CAMERA},
                    PERMISSION_REQUEST_CAMERA);
        } else {
            // 已有权限直接初始化扫描
            initQRCodeScan();
        }
    }

    // 权限申请回调
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CAMERA) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initQRCodeScan();
            } else {
                Toast.makeText(this, "需要相机权限才能扫描二维码", Toast.LENGTH_SHORT).show();
                finish();
            }
        }
    }

    private void initQRCodeScan() {
        PreviewView preview = findViewById(R.id.view);
        BarcodeScanner barcodeScanner = BarcodeScanning.getClient(
                new BarcodeScannerOptions.Builder()
                        .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
                        .build()
        );
        CameraSourceConfig cameraSourceConfig = new CameraSourceConfig.Builder(
                this, barcodeScanner, task -> {
                    // 补充异常处理分支
                    if (task.isSuccessful()){
                        final List<Barcode> qrCode = task.getResult();
                        if (!qrCode.isEmpty()) {
                            Intent intent = new Intent();
                            intent.putExtra("QR", qrCode.get(0).getDisplayValue());
                            setResult(Activity.RESULT_OK, intent);
                            if (cameraXSource != null) {
                                cameraXSource.stop();
                            }
                            finish();
                        }
                    } else {
                        // 打印错误信息方便定位
                        Exception e = task.getException();
                        if (e != null) {
                            e.printStackTrace();
                        }
                    }
        }).setFacing(CameraSourceConfig.CAMERA_FACING_BACK).build();
        cameraXSource = new CameraXSource(cameraSourceConfig, preview);
        try {
            cameraXSource.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 页面销毁时停止相机释放资源
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (cameraXSource != null) {
            cameraXSource.stop();
        }
    }
}

依赖检查(模块级build.gradle)

确保已导入以下依赖:

// ML Kit 二维码识别
implementation 'com.google.mlkit:barcode-scanning:17.2.0'
// ML Kit CameraX 支持
implementation 'com.google.mlkit:vision-camera:17.0.1'
// CameraX 核心依赖
implementation 'androidx.camera:camera-core:1.3.0'
implementation 'androidx.camera:camera-camera2:1.3.0'
implementation 'androidx.camera:camera-lifecycle:1.3.0'
implementation 'androidx.camera:camera-view:1.3.0'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:36:02