Google Vision识别相邻条码/二维码时崩溃问题求助
解决Google Vision多条码扫描崩溃问题
嘿,我来帮你排查下这个多条码扫描崩溃的问题!从你的代码来看,几个细节处理不当可能是导致崩溃的原因,我给你拆解下问题点和修复方案:
一、先修正代码里的明显错误
1. 类名引用错误
你的Activity类是ScanningActivity,但代码里多处用了AddScanningActivity.this(比如BarcodeDetector的Builder里),这会导致上下文实例错误,在多条码扫描场景下容易触发崩溃。先把所有AddScanningActivity.this替换成ScanningActivity.this。
2. 振动器的权限与兼容问题
直接调用vibrator.vibrate(100)在API 26+已经被废弃,而且如果没声明振动权限,会抛出异常导致崩溃:
- 首先在
AndroidManifest.xml里添加权限:
<uses-permission android:name="android.permission.VIBRATE" />
- 然后修改振动代码,适配不同API版本:
Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(VIBRATOR_SERVICE); if (vibrator != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)); } else { vibrator.vibrate(100); } }
3. 相机资源重复释放
当扫描到多个条码时,receiveDetections可能会被多次触发,你现在的代码每次都会调用cameraSource.release(),重复释放资源必然会导致崩溃。可以加一个全局标志位防止重复释放:
// 在Activity类中定义全局标志位 private boolean isCameraReleased = false; // 修改receiveDetections里的释放逻辑 handler.post(new Runnable() { @Override public void run() { if (!isCameraReleased) { cameraSource.release(); isCameraReleased = true; } } });
二、优化多条码处理逻辑
如果你想支持同时扫描多个条码(而不是扫到就立刻停止),可以遍历所有检测到的条码做业务处理,而不是直接释放相机。比如:
@Override public void receiveDetections(Detector.Detections<Barcode> detections) { final SparseArray<Barcode> barcodes = detections.getDetectedItems(); if (barcodes.size() != 0) { // 处理振动(用上面修复后的代码) Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(VIBRATOR_SERVICE); if (vibrator != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)); } else { vibrator.vibrate(100); } } // 收集所有条码信息 StringBuilder allBarcodes = new StringBuilder(); for (int i = 0; i < barcodes.size(); i++) { Barcode barcode = barcodes.valueAt(i); allBarcodes.append("条码内容:").append(barcode.displayValue).append("\n"); // 这里可以把每个条码存入列表或者做其他业务处理 } // 回到主线程更新UI Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { Toast.makeText(ScanningActivity.this, allBarcodes.toString(), Toast.LENGTH_LONG).show(); // 如果不需要继续扫描,再释放相机 // cameraSource.release(); } }); } }
三、补充权限回调处理
你的代码里没有处理相机权限申请的回调,用户拒绝权限后相机无法启动,也可能引发异常,添加这个方法:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == requestCameraPermissionID) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { try { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { cameraSource.start(cameraPreview.getHolder()); } } catch (IOException e) { e.printStackTrace(); } } else { // 提示用户需要相机权限才能扫描 Toast.makeText(this, "需要相机权限才能使用扫描功能", Toast.LENGTH_SHORT).show(); finish(); } } }
最后
把这些修改完之后,多条码扫描的崩溃问题应该就能解决了。如果还是有问题,建议查看Logcat里的具体异常信息,看看是不是还有其他资源冲突或者空指针的问题。
内容的提问来源于stack exchange,提问作者BramH




