二维码扫描功能从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
相关产品推荐
相关产品推荐

