如何自动检测到 barcode/QR
How to get detected barcode/QR automatically
我尝试了新的 Google Play 服务功能 - Barcode/QR 扫描仪。在 sample 中,应用程序通过点击按钮开始扫描,结果也是 return 点击时编辑。
有没有办法将其行为更改为 return 立即检测到 barcode/QR?
我不是第一个对this感到好奇的人。
提前致谢。
更新!
对于未来的读者,您可以使用 this project,其中包括几乎所有设备上的全屏预览。之前的答案不是一个可靠的实现,而是一个快速的解决方案。 github 存储库包含所有更改并检查更改日志。
我建议不要创建静态变量。他们以后会咬你的。
我的建议是在您的 TrackerFactory
上创建某种 listener/callback 并在您的 Trackers
上使用它。这是 Fragments
、Adapters
和许多其他 Android 类 使用的模式,为什么不复制它们呢?
第 1 步: 在您的 BarcodeGraphicTracker
中创建一个接口(更改部分的代码):此处侦听器已初始化,它会在第一次成功检测时发送最终回调响应, 回到 Tracker Activity
(相机第一次打开的地方)。
public class BarcodeGraphicTracker extends Tracker<Barcode> {
private GraphicOverlay<BarcodeGraphic> mOverlay;
private BarcodeGraphic mGraphic;
private NewDetectionListener mListener;
[...]
@Override
public void onNewItem(int id, Barcode item) {
mGraphic.setId(id);
if (mListener != null) mListener.onNewDetection(item);
}
public void setListener(NewDetectionListener mListener) {
this.mListener = mListener;
}
[...]
public interface NewDetectionListener {
void onNewDetection(Barcode barcode);
}
}
步骤 2:更改 BarcodeTrackerFactory 的构造函数以实现接口。侦听器实例传递给 BarcodeGraphicTracker
进行初始化。代码:
public class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
private BarcodeGraphicTracker.NewDetectionListener newDetectionListener;
private GraphicOverlay<BarcodeGraphic> mGraphicOverlay;
public BarcodeTrackerFactory(GraphicOverlay<BarcodeGraphic> barcodeGraphicOverlay, BarcodeGraphicTracker.NewDetectionListener listener) {
mGraphicOverlay = barcodeGraphicOverlay;
newDetectionListener = listener;
}
@Override
public Tracker<Barcode> create(Barcode barcode) {
BarcodeGraphic graphic = new BarcodeGraphic(mGraphicOverlay);
BarcodeGraphicTracker tracker = new BarcodeGraphicTracker(mGraphicOverlay, graphic);
if (newDetectionListener != null) tracker.setListener(newDetectionListener);
return tracker;
}
}
最后一步: 在您的 Tracker Activity
中使用回调初始化检测器实例。此回调可用于侦听来自首次检测到的 Bar/QR 代码的数据。
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(graphicOverlay,
new BarcodeGraphicTracker.NewDetectionListener() {
@Override
public void onNewDetection(Barcode barcode) {
Log.d("Barcode detected! - " + barcode.displayValue);
//To send the result back to the Activity which is waiting for the result
Intent data = new Intent();
data.putExtra(BarcodeObject, barcode);
setResult(CommonStatusCodes.SUCCESS, data);
finish();
}
});
barcodeDetector.setProcessor(new MultiProcessor.Builder<>(barcodeFactory).build());
我尝试了新的 Google Play 服务功能 - Barcode/QR 扫描仪。在 sample 中,应用程序通过点击按钮开始扫描,结果也是 return 点击时编辑。
有没有办法将其行为更改为 return 立即检测到 barcode/QR?
我不是第一个对this感到好奇的人。
提前致谢。
更新!
对于未来的读者,您可以使用 this project,其中包括几乎所有设备上的全屏预览。之前的答案不是一个可靠的实现,而是一个快速的解决方案。 github 存储库包含所有更改并检查更改日志。
我建议不要创建静态变量。他们以后会咬你的。
我的建议是在您的 TrackerFactory
上创建某种 listener/callback 并在您的 Trackers
上使用它。这是 Fragments
、Adapters
和许多其他 Android 类 使用的模式,为什么不复制它们呢?
第 1 步: 在您的 BarcodeGraphicTracker
中创建一个接口(更改部分的代码):此处侦听器已初始化,它会在第一次成功检测时发送最终回调响应, 回到 Tracker Activity
(相机第一次打开的地方)。
public class BarcodeGraphicTracker extends Tracker<Barcode> {
private GraphicOverlay<BarcodeGraphic> mOverlay;
private BarcodeGraphic mGraphic;
private NewDetectionListener mListener;
[...]
@Override
public void onNewItem(int id, Barcode item) {
mGraphic.setId(id);
if (mListener != null) mListener.onNewDetection(item);
}
public void setListener(NewDetectionListener mListener) {
this.mListener = mListener;
}
[...]
public interface NewDetectionListener {
void onNewDetection(Barcode barcode);
}
}
步骤 2:更改 BarcodeTrackerFactory 的构造函数以实现接口。侦听器实例传递给 BarcodeGraphicTracker
进行初始化。代码:
public class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
private BarcodeGraphicTracker.NewDetectionListener newDetectionListener;
private GraphicOverlay<BarcodeGraphic> mGraphicOverlay;
public BarcodeTrackerFactory(GraphicOverlay<BarcodeGraphic> barcodeGraphicOverlay, BarcodeGraphicTracker.NewDetectionListener listener) {
mGraphicOverlay = barcodeGraphicOverlay;
newDetectionListener = listener;
}
@Override
public Tracker<Barcode> create(Barcode barcode) {
BarcodeGraphic graphic = new BarcodeGraphic(mGraphicOverlay);
BarcodeGraphicTracker tracker = new BarcodeGraphicTracker(mGraphicOverlay, graphic);
if (newDetectionListener != null) tracker.setListener(newDetectionListener);
return tracker;
}
}
最后一步: 在您的 Tracker Activity
中使用回调初始化检测器实例。此回调可用于侦听来自首次检测到的 Bar/QR 代码的数据。
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(graphicOverlay,
new BarcodeGraphicTracker.NewDetectionListener() {
@Override
public void onNewDetection(Barcode barcode) {
Log.d("Barcode detected! - " + barcode.displayValue);
//To send the result back to the Activity which is waiting for the result
Intent data = new Intent();
data.putExtra(BarcodeObject, barcode);
setResult(CommonStatusCodes.SUCCESS, data);
finish();
}
});
barcodeDetector.setProcessor(new MultiProcessor.Builder<>(barcodeFactory).build());