# QR Code या बारकोड कैसे पढ़ें

> BarcodePicker का उपयोग करके कैमरे से QR/बारकोड स्कैन करें, या CameraBarcode के साथ किसी Image को डिकोड करें।

Source: https://crossfly.dev/hi/docs/cookbook/device/ler-codigo-de-barras — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# QR Code या बारकोड कैसे पढ़ें

**उद्देश्य।** कैमरा खोलें और `BarcodePicker` के साथ लाइव **QR Code** या **बारकोड** पढ़ें, या
`CameraBarcode` के साथ पहले से कैप्चर की गई किसी `Image` से कोड डिकोड करें।

## उपयोग की गई APIs
- `BarcodePicker(String title, BarcodeFormat... formats)` — लाइव रीडिंग की **abstract** विंडो; आप इसे **extend** करते हैं और `onBarcode(BarcodeFormat, String)` लागू करते हैं। खाली `formats` = सभी स्वीकार करता है।
- `abstract void onBarcode(BarcodeFormat format, String code)` — प्रारूप फ़िल्टर से गुजरने वाले प्रत्येक नए डिकोड किए गए कोड पर कॉल किया जाता है।
- `BarcodePicker.formats1D` / `formats2D` (स्टैटिक arrays) — प्रारूपों के तैयार सेट; `formats2D` में `QR_CODE` है।
- `BarcodePicker.beep` / `BarcodePicker.vibrate` (स्टैटिक `boolean`) — डिकोड करते समय फ़ीडबैक (डिफ़ॉल्ट `true`)।
- `String getAnswer()` — अंतिम डिकोड किया गया कोड, या रद्द होने पर `null`।
- `CameraBarcode.readBarcode(Image img)` → `com.google.zxing.Result` (या `null`) — किसी स्थिर छवि से डिकोड करता है। **यह thread-safe नहीं है।**

> **महत्वपूर्ण भिन्नता।** `BarcodePicker` **`abstract` है** और `RunnableWith` प्रकार के callback के बजाय
> `onBarcode(...)` मेथड का उपयोग करता है। एक उपवर्ग (अनाम या नामित) instantiate करें। picker डिकोड करते समय
> पहले से ही `beep()`/`vibrate(20)` निकालता है और **दोहराए गए कोड को दबा देता है** (केवल तभी `onBarcode` कॉल करता है जब
> टेक्स्ट बदलता है)। यह पढ़ने पर **स्वयं बंद नहीं होता** — यदि आप पहली रीडिंग पर समाप्त करना चाहते हैं तो
> `onBarcode` के अंदर `hide()` कॉल करें। "X" (नीचे दायाँ कोना) टैप करने पर रद्द हो जाता है।

## पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

```java
package com.exemplo;

import com.google.zxing.*;                  // BarcodeFormat
import dev.crossfly.ui.*;                   // Window, Component, Button, Label
import dev.crossfly.ui.layout.*;            // VerticalLayout
import dev.crossfly.ui.picker.*;            // BarcodePicker

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Label resultado = new Label("");
      add(LAY_AUTO, resultado);

      Button acao = new Button("Ler QR Code");
      acao.onAction(c ->
      {
         // लाइव रीडिंग — केवल QR Code; पहली रीडिंग पर बंद हो जाता है
         BarcodePicker picker = new BarcodePicker("Aponte para o QR", BarcodePicker.formats2D)
         {
            protected void onBarcode(BarcodeFormat format, String code)
            {
               // paint thread के बाहर कॉल किया गया → onUI(...) के साथ UI पर लौटें
               Component.onUI(() ->
               {
                  resultado.setText("Lido: " + code);
                  hide();            // पहली रीडिंग पर scanner बंद करता है (वैकल्पिक)
               });
            }
         };
         picker.show();
      });
      add(LAY_AUTO, acao);
   }
}
```

> नीचे का अंश **केवल मुख्य भाग** दिखाता है। चलाने के लिए, इसे ऊपर दिए गए `MainWindow` ढाँचे में रखें।

## न्यूनतम अंश

```java
// स्रोत में सत्यापित: BarcodePicker.java (constructor, onBarcode, formats2D, getAnswer); CameraBarcode.java (readBarcode)
import com.google.zxing.*;                 // BarcodeFormat, Result
import dev.crossfly.ui.picker.*;           // BarcodePicker
import dev.crossfly.ui.*;                  // Component (onUI)

// 1) लाइव रीडिंग — केवल QR Code; पहली रीडिंग पर बंद हो जाता है
BarcodePicker picker = new BarcodePicker("Aponte para o QR", BarcodePicker.formats2D) {
   protected void onBarcode(BarcodeFormat format, String code) {
      // paint thread के बाहर कॉल किया गया → onUI(...) के साथ UI पर लौटें
      Component.onUI(() -> {
         processar(code);   // उदा.: किसी field को भरें, नेविगेट करें, आदि।
         hide();            // पहली रीडिंग पर scanner बंद करता है (वैकल्पिक)
      });
   }
};
picker.show();             // सभी formats स्वीकार करने के लिए constructor में formats खाली छोड़ें

// 2) किसी स्थिर Image से डिकोड करें (एक समय में एक camera/thread — thread-safe नहीं है)
Result r = CameraBarcode.readBarcode(minhaImagem);
if (r != null) {
   String texto = r.getText();
   BarcodeFormat fmt = r.getBarcodeFormat();
}
```

## और गहराई में जाएँ
- कैमरा गाइड: [डिवाइस का कैमरा](/docs/data-and-services/device-camera) · Widget: [BarcodePicker](/docs/ui/widgets/barcodepicker)
- संबंधित रेसिपी: [tirar-foto.md](/docs/cookbook/device/tirar-foto)
