android - 我开发了一个 android 应用程序,它可以扫描产品上标记的 QR 码。像 Inigma 这样的应用程序运行良好,但我的应用程序无法扫描
问题描述
在代码优化方面需要帮助。我开发了一个 android 应用程序,它可以扫描产品上标记的QR 码。
我已经测试了一些其他应用程序(如 Inigma)运行良好但我的应用程序无法扫描的场景:以下情况:
1)当我扫描在线生成的二维码时,我的应用程序和 inigma 都可以正常工作
.2) 当我扫描瓶子等产品上打印的二维码时,我的应用程序无法扫描,但 inigma 扫描完美。
我在哪里落后?有人可以帮帮我吗?我必须从过去 1 周开始尝试解决这个问题,但没有得到解决方案。
技术细节:我正在使用ZXING库进行 QR 码扫描。
请帮忙 ... :(
解决方案
尝试使用此方法并在 onResume() 循环中调用该方法
private void initialiseDetectorsAndSources() {
// Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.ic_notfound)).getBitmap();
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(BarCodeScanActivity.this)
.setBarcodeFormats(Barcode.ALL_FORMATS)
.build();
cameraSource = new CameraSource.Builder(this, barcodeDetector)
.setRequestedPreviewSize(1920, 1080)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setAutoFocusEnabled(true) //you should add this feature
.build();
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
if (ActivityCompat.checkSelfPermission(BarCodeScanActivity.this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
cameraSource.start(surfaceView.getHolder());
} else {
ActivityCompat.requestPermissions(BarCodeScanActivity.this, new
String[]{Manifest.permission.CAMERA}, AppUtils.CAMERA_PERMISSION);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
// Toast.makeText(BarCodeScanActivity.this, "To prevent memory leaks barcode scanner has been stopped", Toast.LENGTH_SHORT).show();
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes != null && barcodes.size() > 0) {
available.post(new Runnable() {
@Override
public void run() {
String scandata = barcodes.valueAt(0).displayValue;
// the scandata is your barcode
}
});
}
}
});
}
推荐阅读
- python - AssertionError: HybridBlock 要求转发的第一个参数是 Symbol 或 NDArray,但是得到了
- matlab - 如何使用正交投影 3D 绘制参数曲线?
- ruby-on-rails - Rspec Rails - 在请求规范中模拟远程请求
- npm - 已解决:`gatsby develop` 产生错误:EISDIR:对目录的非法操作,读取 .cache 文件夹上的链接
- java - 如何修复从 Excel 输入到网页的数据
- scala - 如何传递命令行参数scala
- flutter - 底部导航中的对齐小部件覆盖正文
- c++ - OR 执行所有评估的语句
- sql-server - SQL Server 性能 <>,不在,在
- vue.js - 如果元素是动态的,如何设置 v-model?