# PhotoPicker

> डिवाइस के कैमरे से फ़ोटो या वीडियो कैप्चर करें — बने हुए फ़ाइल का पथ वापस मिलता है।

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

# PhotoPicker

`PhotoPicker` डिवाइस के कैमरे का उपयोग करके **फ़ोटो** कैप्चर करता है या **वीडियो** रिकॉर्ड करता है (ऑडियो के साथ/बिना), इफ़ेक्ट (चमक/कंट्रास्ट/तीक्ष्णता), कैमरा स्विच और वैकल्पिक पुष्टि के साथ। यह पिकर पैटर्न का पालन करता है (देखें [`Picker`](/docs/ui/widgets/picker)), लेकिन परिणाम एक **फ़ाइल पथ** है — या एक त्रुटि स्ट्रिंग।

> 🔴 · **पैकेज:** `dev.crossfly.ui.picker` · **एक्सटेंड करता है:** `Picker implements GdxCamera.Listener` · **हार्डवेयर:** कैमरा

## कब उपयोग करें
- ऐप के भीतर फ़ोटो लेना या वीडियो रिकॉर्ड करना।

## कब उपयोग न करें
- बारकोड/QR पढ़ना → [`BarcodePicker`](/docs/ui/widgets/barcodepicker) का उपयोग करें।

## दिखावट
पूर्ण-स्क्रीन कैमरा प्रीव्यू (काला बैकग्राउंड, बिना फ़्रेम) अर्ध-पारदर्शी गोल बटनों के साथ: रद्द करें (X), कैप्चर/रिकॉर्ड (केंद्रीय), कैमरा बदलें और Config/Pause। पुष्टि के साथ फ़ोटो मोड में, एक पुष्टि/दोबारा-लें स्क्रीन।

## पूरा उदाहरण (कॉपी करें, पेस्ट करें और चलाएं)
`PhotoPicker` एक कैमरा ओवरले है — इसे खोलने के लिए, इसे किसी `Button` से ट्रिगर करें। उदाहरण बुनियादी उपयोग का पुनः उपयोग करता है और लौटाया गया पथ (या त्रुटि) एक `Label` में दिखाता है।

```java
package com.exemplo;

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("Nenhuma foto ainda");
      add(LAY_AUTO, saida);

      Button tirarFoto = new Button("Tirar foto")
         .onAction(c ->
         {
            PhotoPicker pp = new PhotoPicker(PhotoPicker.Preview.PHOTO);
            pp.show(answer ->
            {
               String caminho = (String) answer;
               if (pp.isError())
                  saida.setText("Falha na câmera: " + caminho);
               else
                  saida.setText("Foto salva em: " + caminho);
            });
         });
      add(LAY_AUTO, tirarFoto);
   }
}
```

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

## बुनियादी उपयोग
```java
PhotoPicker pp = new PhotoPicker(PhotoPicker.Preview.PHOTO);
pp.show(answer ->
{
   String caminho = (String) answer;
   if (pp.isError())
      new Alert("Falha na câmera", caminho, "OK").show();
   else
      Debug.log("Foto salva em: " + caminho);
});
```

## कंस्ट्रक्टर
| कंस्ट्रक्टर | विवरण |
|---|---|
| `PhotoPicker(Preview type)` | मोड: `Preview.PHOTO`, `Preview.MUTED_VIDEO` या `Preview.AUDIO_VIDEO`। |

## प्रॉपर्टीज़ और अनुकूलन
| फ़ील्ड | प्रकार | Default | क्या करता है |
|---|---|---|---|
| `PhotoPicker.defaultJpegQuality` (स्टैटिक) | `int` | 90 | फ़ोटो सहेजते समय JPG गुणवत्ता। |
| `PhotoPicker.showConfirmation` (स्टैटिक) | `boolean` | `true` | फ़ोटो मोड में पुष्टि/दोबारा-लें स्क्रीन। |
| `videoQuality` | `Camera.AVQuality` | HIGH | वीडियो की गुणवत्ता। |
| `videoTimeLimit` | `int` (s) | 0 | रिकॉर्डिंग सीमा (0 = बिना सीमा)। |

## कॉलबैक और इवेंट
| कॉलबैक | कब ट्रिगर होता है |
|---|---|
| `show(onAnswer)` | बंद होने पर, पथ की `String` सौंपता है (या `"ERROR: ..."`)। |

## परिणाम (महत्वपूर्ण)
`getAnswer()` फ़ाइल का **पथ** लौटाता है (फ़ोटो का JPG या वीडियो का MP4)। कैमरा त्रुटि की स्थिति में, यह स्ट्रिंग `"ERROR: ..."` लौटाता है।

> ⚠️ मान को पथ के रूप में मानने से **पहले हमेशा `isError()` की जाँच करें** — `getAnswer()` पथ और त्रुटि संदेश दोनों को मिलाता है।

## स्थितियां
- `onAppPause`/`onAppResume` कैमरे को रोकते/फिर से शुरू करते हैं; `onRemove` सब कुछ रोकता है और listener को साफ़ करता है।
- कैमरा त्रुटि → `answer = "ERROR: ..."` लिखता है और बंद कर देता है।

### ऑडियो और 30s सीमा वाला वीडियो
```java
PhotoPicker vp = new PhotoPicker(PhotoPicker.Preview.AUDIO_VIDEO);
vp.videoTimeLimit = 30;
vp.show(a -> Debug.log("MP4 em: " + a));
```

## सर्वोत्तम अभ्यास
- लौटाई गई फ़ाइल खोलने से पहले **`isError()` की जाँच करें**।
- `hide()` के बाद उसी इंस्टैंस का पुनः उपयोग न करें — बंद होने पर कैमरा संसाधन मुक्त हो जाते हैं।

## सामान्य गलतियां
- **`isError()` की जाँच किए बिना `answer` को पथ के रूप में मानना** — यह `"ERROR: ..."` हो सकता है।
- **पोर्टेबल पथ मानना** — वीडियो का पथ `/sdcard/...` (Android) में निश्चित है।

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