1

我正在使用 google 提供的 quickstart-android 代码,但经过多次尝试,我无法找到不返回 null 的上下文。BarcodeScannerProcessor 本身不是 Activity,因此我尝试创建 LivePreviewActivity 的实例并将其用作意图中的上下文,但它为空。

目标是一旦识别出有效的条形码,我想打开一个新活动,允许用户验证值并按下按钮调用 Web 服务以通过 API 将条形码发布到数据库。我很难找到有效的上下文,并且应用程序在尝试执行 Intent 时崩溃。

从第 97-107 行开始:

https://github.com/jamiekeefer/quickstart-android/blob/master/mlkit/app/src/main/java/com/google/firebase/samples/apps/mlkit/java/barcodescanning/BarcodeScanningProcessor.java

        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,这无助于澄清事情。

我赞赏任何有助于从该上下文中识别或违反有效意图的帮助。谢谢你。

4

4 回答 4

1

所以我假设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,并且将具有您活动的上下文。我希望这回答了你的问题。

于 2018-11-20T17:02:00.647 回答
1

试试这个创建Application

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>

使用此 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);
于 2018-11-20T17:07:43.327 回答
1

处理此问题的另一种方法是创建 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>)
于 2018-11-20T17:18:13.403 回答
1

您可以从以下位置获取上下文graphicOverlay

Context context = graphicOverlay.getContext();
于 2020-05-08T15:14:21.860 回答