java - 如何从 Android firebase ML-Kit BarcodeScannerProcessor onSuccess 找到上下文并启动新活动
问题描述
我正在使用 google 提供的 quickstart-android 代码,但经过多次尝试,我无法找到不返回 null 的上下文。BarcodeScannerProcessor 本身不是 Activity,因此我尝试创建 LivePreviewActivity 的实例并将其用作意图中的上下文,但它为空。
目标是一旦识别出有效的条形码,我想打开一个新活动,允许用户验证值并按下按钮调用 Web 服务以通过 API 将条形码发布到数据库。我很难找到有效的上下文,并且应用程序在尝试执行 Intent 时崩溃。
从第 97-107 行开始:
for (int i = 0; i < barcodes.size(); ++i) {
FirebaseVisionBarcode barcode = barcodes.get(i);
BarcodeGraphic barcodeGraphic = new BarcodeGraphic(graphicOverlay, barcode);
graphicOverlay.add(barcodeGraphic);
System.out.println(barcode.getRawValue());
if (!barcode.getRawValue().equals("") ) {
System.out.println("Got the number:" + barcode.getRawValue() + " Context: " + mContext); //OLD SCHOOL DEBUG OUTPUT
//enter code to start activity
Intent intent = new Intent(mContext, SendScannedBarcode.class);
String message = scannedBarcode;
intent.putExtra(EXTRA_MESSAGE, message);
mContext.startActivity(intent);
}
}
您可以在 repo 中备份以查看我尝试获取上下文的 LivePreviewActivity 实例。
我已经尝试了很多事情并阅读了有关上下文、视图和活动的内容,并且基本上完全把自己弄糊涂了。我能找到的唯一 tuts 是使用 Kotlin,这无助于澄清事情。
我赞赏任何有助于从该上下文中识别或违反有效意图的帮助。谢谢你。
解决方案
所以我假设LivePreviewActivity
你正在创建一个类的对象BarcodeScanningProcessor
。您可以做的是更改BarcodeScanningProcessor
类中的构造函数以接受上下文,然后传入您LivePreviewActivity
的上下文。
这就是代码的样子:
在BarcodeScanningProcessor
:
public BarcodeScanningProcessor(Context context) {
// Note that if you know which format of barcode your app is dealing with, detection will be
// faster to specify the supported barcode formats one by one, e.g.
// new FirebaseVisionBarcodeDetectorOptions.Builder()
// .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE)
// .build();
detector = FirebaseVision.getInstance().getVisionBarcodeDetector();
this.mContext = context;
}
然后在LivePreviewActivity
:
在您的活动的特定情况下,您将执行以下操作:
case BARCODE_DETECTION:
Log.i(TAG, "Using Barcode Detector Processor");
cameraSource.setMachineLearningFrameProcessor(new BarcodeScanningProcessor(getApplicationContext()));
break;
或者,如果您只是想创建一个类的对象,您可以这样做:
BarcodeScanningProcessor bsp = new BarcodeScanningProcessor(getApplicationContext());
这现在应该为您的BarcodeScanningProcessor
班级提供您活动的上下文。现在,在 中BarcodeScanningProcessor
,mContext 不应为 null,并且将具有您活动的上下文。我希望这回答了你的问题。
推荐阅读
- java - 线程“主”java.lang.NoSuchMethodError 中的异常:org.openqa.selenium.os.CommandLine.find(Ljava/lang/String;)Ljava/lang/String;
- java - JAVA outputStream 什么都不写(outputStream.close 没有帮助)
- r - Rstudio提取子数据库
- c - 无法访问主循环,因为 ADC DMA 中断调用 STM32F072CBT6
- vba - 在大型项目中使用接口时出现错误
- python - 检查数据框中是否有未命名的列,然后在 Pandas 中返回指示
- python - 无法理解代码中的特定行
- php - 使用 PHP 与 SAPRFC 连接
- alfresco - 如何从 Alfresco 中的 webscript 访问文档属性?
- reactjs - 调整