# BarcodePicker

> कैमरा द्वारा बारकोड/QR कोड की रीडिंग (अमूर्त वर्ग)।

Source: https://crossfly.dev/hi/docs/ui/widgets/barcodepicker — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# BarcodePicker

`BarcodePicker` लाइव कैमरा फ्रेम से **बारकोड/QR कोड** पढ़ता है, फ़ॉर्मेट के आधार पर फ़िल्टर करते हुए। यह एक **अमूर्त वर्ग** है: उपभोक्ता `onBarcode(BarcodeFormat format, String code)` को कार्यान्वित करता है। यह पिकर पैटर्न का अनुसरण करता है (देखें [`Picker`](/docs/ui/widgets/picker)) — पढ़े गए पेलोड को `getAnswer()` के माध्यम से लौटाता है।

> 🔴 · **पैकेज:** `dev.crossfly.ui.picker` · **विस्तार करता है:** `Picker implements GdxCamera.Listener` (अमूर्त) · **हार्डवेयर:** कैमरा

> ℹ️ यह `BarcodePicker` **कैमरा द्वारा रीडिंग** है और मौजूद रहता है। इसे बारकोड *जनरेशन* की पुरानी यूटिलिटी (`util/barcode`) के साथ भ्रमित न करें, जो आधुनिकीकरण में हटा दी गई थी।

## कब उपयोग करें
- बारकोड (उत्पाद, टिकट) या QR कोड स्कैन करना।

## कब उपयोग न करें
- फ़ोटो लेना/वीडियो रिकॉर्ड करना → [`PhotoPicker`](/docs/ui/widgets/photopicker) का उपयोग करें।

## दिखावट
पूर्ण-स्क्रीन कैमरा प्रीव्यू (काली पृष्ठभूमि), ऊपर शीर्षक, केंद्र में लक्ष्य के लिए एक **लाल क्रॉसहेयर** और नीचे-दाएँ कोने में बंद करने के लिए एक सफ़ेद "X"।

## संपूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
`BarcodePicker` **अमूर्त** है: इसे एक ऐसे बॉडी के साथ इंस्टेंशिएट करें जो `onBarcode` कार्यान्वित करे। चूँकि यह एक कैमरा ओवरले है, इसे किसी `Button` से ट्रिगर करें। यह उदाहरण बुनियादी उपयोग को पुनः उपयोग करता है (1D फ़ॉर्मेट, पहली रीडिंग पर बंद होता है) और पेलोड को एक `Label` में लिखता है। `BarcodeFormat` `com.google.zxing` से आता है।

```java
package com.exemplo;

import com.google.zxing.BarcodeFormat;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.picker.*;

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

      Label saida = new Label("Nenhum código lido");
      add(LAY_AUTO, saida);

      Button escanear = new Button("Escanear código")
         .onAction(c ->
         {
            BarcodePicker scanner = new BarcodePicker("Aponte para o código", BarcodePicker.formats1D)
            {
               protected void onBarcode(BarcodeFormat format, String code)
               {
                  onUI(() -> saida.setText(format + ": " + code)); // paint thread पर वापस
                  hide(); // पहली रीडिंग के बाद बंद हो जाता है (अपने आप बंद नहीं होता)
               }
            };
            scanner.show(answer -> {});
         });
      add(LAY_AUTO, escanear);
   }
}
```

> नीचे दिए गए स्निपेट **केवल मूल भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, इन्हें ऊपर दिए `MainWindow` कंकाल में रखें।

## बुनियादी उपयोग
```java
BarcodePicker scanner = new BarcodePicker("Aponte para o código", BarcodePicker.formats1D)
{
   protected void onBarcode(BarcodeFormat format, String code)
   {
      Debug.log(format + ": " + code);
      hide(); // पहली रीडिंग के बाद बंद हो जाता है
   }
};
scanner.show(answer -> campoCodigo.setText((String) answer));
```

## कंस्ट्रक्टर
| कंस्ट्रक्टर | विवरण |
|---|---|
| `BarcodePicker(String title, BarcodeFormat... formats)` | शीर्षक + स्वीकृत फ़ॉर्मेट (varargs; खाली = सभी)। अमूर्त — `onBarcode` कार्यान्वित करने वाली बॉडी के साथ इंस्टेंशिएट करें। |

## गुण और अनुकूलन
| सदस्य | प्रकार | डिफ़ॉल्ट | क्या करता है |
|---|---|---|---|
| `BarcodePicker.formats1D` (स्थैतिक) | `BarcodeFormat[]` | — | 1D फ़ॉर्मेट का तैयार सेट (CODE_128, EAN_13…)। |
| `BarcodePicker.formats2D` (स्थैतिक) | `BarcodeFormat[]` | — | 2D फ़ॉर्मेट का तैयार सेट (QR_CODE)। |
| `BarcodePicker.beep` (स्थैतिक) | `boolean` | `true` | डिकोड करने पर बीप करता है। |
| `BarcodePicker.vibrate` (स्थैतिक) | `boolean` | `true` | डिकोड करने पर कंपन करता है। |

## कॉलबैक और इवेंट
| कॉलबैक | कब ट्रिगर होता है |
|---|---|
| `onBarcode(BarcodeFormat, String)` | (अमूर्त) स्वीकृत फ़ॉर्मेट के किसी कोड को डिकोड करने पर। |
| `show(onAnswer)` | बंद होने पर, अंतिम पढ़े गए पेलोड की `String` देता है। |

`getAnswer()` अंतिम डिकोड किया गया पेलोड लौटाता है, या यदि रद्द किया गया हो तो `null`।

## अवस्थाएँ
- **पता चलने पर कोई स्वचालित `hide()` नहीं है** — बंद करने का निर्णय आपका `onBarcode` लेता है (`hide()` कॉल करके)। इसके बिना, स्कैनर पढ़ता रहता है (निरंतर रीडिंग के लिए उपयोगी)।
- लगातार दोहराए गए कोड (समान `lastCode`) अनदेखे किए जाते हैं।
- `onAppPause`/`onAppResume` कैमरा प्रबंधित करते हैं; `onRemove` डिकोडिंग थ्रेड को रोकता है।

### केवल QR स्वीकार करें और पहली रीडिंग पर बंद करें
```java
BarcodePicker scanner = new BarcodePicker("Leia o QR", BarcodePicker.formats2D)
{
   protected void onBarcode(BarcodeFormat format, String code)
   {
      onUI(() -> campoCodigo.setText(code)); // paint thread में UI अपडेट
      hide();
   }
};
scanner.show(answer -> Debug.log("Lido: " + answer));
```

## अच्छे तरीके
- एकल रीडिंग के लिए `onBarcode` में `hide()` कॉल करें; निरंतर रीडिंग के लिए इसे छोड़ दें।
- डिकोडिंग पृष्ठभूमि थ्रेड में चलती है — UI अपडेट को `onUI(...)` में लपेटें।

## सामान्य गलतियाँ
- **`hide()` भूल जाना** जब एकल रीडिंग चाहते थे — स्कैनर सक्रिय रहता है।
- **`onBarcode` में सीधे UI अपडेट करना** — `onUI(...)` के साथ paint thread का सम्मान करें।

## यह भी देखें
- क्षेत्र गाइड: [`ui/`](/docs/ui) · रेसिपी: [`cookbook/`](/docs/cookbook)
- पैटर्न का आधार: [`Picker`](/docs/ui/widgets/picker)
- संबंधित घटक: [`PhotoPicker`](/docs/ui/widgets/photopicker)
