You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动