Как я могу найти контекст и начать новую деятельность с Android Firebase ML-Kit BarcodeScannerProcessor onSuccess

Я использую код быстрого запуска Android, предоставленный Google, но после многих попыток я не смог найти контекст, который не возвращает ноль. BarcodeScannerProcessor сам по себе не является Activity, поэтому я попытался создать экземпляр LivePreviewActivity и использовать его в качестве контекста в намерении, но он нулевой.

Цель состоит в том, чтобы после того, как действительный штрих-код был распознан, я хочу открыть новое действие, которое позволяет пользователю проверить значение, и одним нажатием кнопки вызвать веб-сервис для отправки штрих-кода в базу данных через API. Я испытываю трудности с поиском действительного контекста, и приложение падает, когда оно пытается выполнить Намерение.

Начиная со строки 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);
        }


    }

Вы можете сделать резервную копию в репозитории, чтобы увидеть экземпляр LivePreviewActivity, где я пытаюсь получить контекст.

Я попробовал несколько вещей и прочитал о Контексте, Представлениях и Действиях и в основном полностью запутался. Единственное, что я могу найти, это использовать Kotlin, который не помогает прояснить ситуацию.

Я приветствую любую помощь в выявлении или определении действительного намерения из этого контекста. Спасибо.

3 ответа

Решение

Поэтому я предполагаю, что в вашем 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 не должен быть нулевым и будет иметь контекст вашей деятельности. Надеюсь, это ответит на ваш вопрос.

Вы можете получить контекст из graphicOverlay:

Context context = graphicOverlay.getContext();

Попробуйте это создать 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);

Другим способом решения этой проблемы является создание нового конструктора 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>)
Другие вопросы по тегам