我如何找到上下文并从 Android firebase ML-Kit BarcodeScannerProcessor onSuccess 开始一个新的 Activity
How can I find context and start a new Activity from Android firebase ML-Kit BarcodeScannerProcessor onSuccess
我正在使用 google 提供的 quickstart-android 代码,但经过多次尝试后,我无法找到不返回 null 的上下文。 BarcodeScannerProcessor 本身不是 Activity,因此我尝试创建 LivePreviewActivity 的实例并将其用作意图中的上下文,但它为空。
目标是一旦识别出有效的条形码,我想打开一个新的 activity 允许用户验证值并按下按钮调用网络服务 post通过 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 where I trying to get context.
的实例
我已经尝试了很多东西并阅读了有关 Context、Views 和 Activities 的内容,基本上已经完全弄糊涂了。我能找到的唯一 tuts 是使用 Kotlin,这无助于澄清事情。
我很感激在此上下文中识别或构建有效 Intent 方面的任何帮助。谢谢。
所以我假设在您的 LivePreviewActivity
中您正在创建 class BarcodeScanningProcessor
的对象。您可以做的是更改 BarcodeScanningProcessor
class 中的构造函数以接受上下文,然后传入 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
:
在您 activity 的特定情况下,您会这样做:
case BARCODE_DETECTION:
Log.i(TAG, "Using Barcode Detector Processor");
cameraSource.setMachineLearningFrameProcessor(new BarcodeScanningProcessor(getApplicationContext()));
break;
或者,如果您只想创建 class 的对象,您可以这样做:
BarcodeScanningProcessor bsp = new BarcodeScanningProcessor(getApplicationContext());
这现在应该为您的 BarcodeScanningProcessor
class 提供 activity 的上下文。现在,在 BarcodeScanningProcessor
中,mContext 不应为 null,并且将具有您的 activity 的上下文。我希望这能回答你的问题。
试试这个创建 Application
class
import android.app.Application;
public class MyApplication extends Application {
static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance=this;
}
public static MyApplication getInstance() {
return instance;
}
}
在清单文件中注册
<application
..
android:name="com.yourpackage.MyApplication"
..>
.
.
.
</application>
开始 activity 使用此 MyApplication。
Intent intent = new Intent(MyApplication.getInstance(), SendScannedBarcode.class);
String message = scannedBarcode;
intent.putExtra(EXTRA_MESSAGE, message);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApplication. getInstance().startActivity(intent);
处理该问题的另一种方法是创建 BarcodeScanningProcessor 的新构造函数,它接受接口回调,并在处理完成后将结果返回给调用者。
public interface BarcodeUpdateListener {
@UiThread
void onBarcodeDetected(Barcode barcode);
}
private BarcodeUpdateListener callback;
public BarcodeScanningProcessor(BarcodeUpdateListener callback){
this.callback = callback;
detector = FirebaseVision.getInstance().getVisionBarcodeDetector();
}
获得结果后将结果传递给调用者
callback.onBarcodeDetected(<Barcode>)
您可以从 graphicOverlay
获取上下文:
Context context = graphicOverlay.getContext();
我正在使用 google 提供的 quickstart-android 代码,但经过多次尝试后,我无法找到不返回 null 的上下文。 BarcodeScannerProcessor 本身不是 Activity,因此我尝试创建 LivePreviewActivity 的实例并将其用作意图中的上下文,但它为空。
目标是一旦识别出有效的条形码,我想打开一个新的 activity 允许用户验证值并按下按钮调用网络服务 post通过 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 where I trying to get context.
的实例我已经尝试了很多东西并阅读了有关 Context、Views 和 Activities 的内容,基本上已经完全弄糊涂了。我能找到的唯一 tuts 是使用 Kotlin,这无助于澄清事情。
我很感激在此上下文中识别或构建有效 Intent 方面的任何帮助。谢谢。
所以我假设在您的 LivePreviewActivity
中您正在创建 class BarcodeScanningProcessor
的对象。您可以做的是更改 BarcodeScanningProcessor
class 中的构造函数以接受上下文,然后传入 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
:
在您 activity 的特定情况下,您会这样做:
case BARCODE_DETECTION:
Log.i(TAG, "Using Barcode Detector Processor");
cameraSource.setMachineLearningFrameProcessor(new BarcodeScanningProcessor(getApplicationContext()));
break;
或者,如果您只想创建 class 的对象,您可以这样做:
BarcodeScanningProcessor bsp = new BarcodeScanningProcessor(getApplicationContext());
这现在应该为您的 BarcodeScanningProcessor
class 提供 activity 的上下文。现在,在 BarcodeScanningProcessor
中,mContext 不应为 null,并且将具有您的 activity 的上下文。我希望这能回答你的问题。
试试这个创建 Application
class
import android.app.Application;
public class MyApplication extends Application {
static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance=this;
}
public static MyApplication getInstance() {
return instance;
}
}
在清单文件中注册
<application
..
android:name="com.yourpackage.MyApplication"
..>
.
.
.
</application>
开始 activity 使用此 MyApplication。
Intent intent = new Intent(MyApplication.getInstance(), SendScannedBarcode.class);
String message = scannedBarcode;
intent.putExtra(EXTRA_MESSAGE, message);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApplication. getInstance().startActivity(intent);
处理该问题的另一种方法是创建 BarcodeScanningProcessor 的新构造函数,它接受接口回调,并在处理完成后将结果返回给调用者。
public interface BarcodeUpdateListener {
@UiThread
void onBarcodeDetected(Barcode barcode);
}
private BarcodeUpdateListener callback;
public BarcodeScanningProcessor(BarcodeUpdateListener callback){
this.callback = callback;
detector = FirebaseVision.getInstance().getVisionBarcodeDetector();
}
获得结果后将结果传递给调用者
callback.onBarcodeDetected(<Barcode>)
您可以从 graphicOverlay
获取上下文:
Context context = graphicOverlay.getContext();