J'utilise le code quickstart-android fourni par google mais après de nombreuses tentatives, je n'arrive pas à trouver un contexte qui ne renvoie pas null. Le BarcodeScannerProcessor n'est pas lui-même une activité, j'ai donc tenté de créer une instance de LivePreviewActivity et de l'utiliser comme contexte dans l'intention, mais il est nul.

L'objectif est qu'une fois qu'un code-barres valide est reconnu, je souhaite ouvrir une nouvelle activité qui permet à un utilisateur de vérifier la valeur et d'appeler un service Web sur simple pression d'un bouton pour publier le code-barres dans une base de données via l'API. J'ai du mal à trouver un contexte valide et l'application se bloque lorsqu'elle essaie d'exécuter l'intention.

À partir de la ligne 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);
        }


    }

Vous pouvez effectuer une sauvegarde dans le dépôt pour voir l'instance de LivePreviewActivity où j'essaie d'obtenir le contexte.

J'ai essayé un certain nombre de choses et lu sur le contexte, les vues et les activités et je me suis complètement confondu. Les seuls tuts que je puisse trouver utilisent Kotlin, ce qui n'aide pas à clarifier les choses.

J'apprécie toute aide pour identifier et construire une intention valide à partir de ce contexte. Je vous remercie.

1
Jamie Keefer 20 nov. 2018 à 19:56

4 réponses

Meilleure réponse

Donc je suppose que dans votre LivePreviewActivity vous créez un objet de la classe BarcodeScanningProcessor. Ce que vous pouvez faire est de changer le constructeur dans la classe BarcodeScanningProcessor pour accepter un contexte, puis vous passez dans le contexte de votre LivePreviewActivity.

Voici à quoi devrait ressembler le code:

Dans 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;
}

Puis dans LivePreviewActivity :

Dans le cas particulier de votre activité, vous feriez:

  case BARCODE_DETECTION:
          Log.i(TAG, "Using Barcode Detector Processor");
          cameraSource.setMachineLearningFrameProcessor(new BarcodeScanningProcessor(getApplicationContext()));
          break;

Ou si vous vouliez simplement créer un objet de la classe, vous pourriez faire: BarcodeScanningProcessor bsp = new BarcodeScanningProcessor(getApplicationContext());

Cela devrait maintenant donner à votre classe BarcodeScanningProcessor le contexte de votre activité. Maintenant, dans BarcodeScanningProcessor, mContext ne doit pas être nul et aura le contexte de votre activité. J'espère que cela répond à votre question.

1
Ishaan Javali 20 nov. 2018 à 17:07

Essayez cette classe create 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;
    }
}

S'inscrire dans le fichier manifeste

<application
        ..
        android:name="com.yourpackage.MyApplication"
        ..>
.
.
.
</application>

démarrer l'activité à l'aide de cette 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);
1
Mr X 20 nov. 2018 à 17:07

Une autre façon de gérer le problème consiste à créer un nouveau constructeur de BarcodeScanningProcessor qui prend le rappel de l'interface et une fois le traitement terminé, renvoie le résultat à l'appelant.

   public interface BarcodeUpdateListener {
      @UiThread
      void onBarcodeDetected(Barcode barcode);
   } 


   private BarcodeUpdateListener callback;

   public BarcodeScanningProcessor(BarcodeUpdateListener callback){
      this.callback = callback;
      detector = FirebaseVision.getInstance().getVisionBarcodeDetector();
   } 

Une fois que vous obtenez le résultat, passez le résultat à l'appelant

callback.onBarcodeDetected(<Barcode>)
1
Ramesh Yankati 20 nov. 2018 à 17:18

Vous pouvez obtenir le contexte de graphicOverlay:

Context context = graphicOverlay.getContext();
1
Yassine Ahammar 8 mai 2020 à 15:14