Android ऐप्लिकेशन, पोर्ट्रेट मोड में रखे गए फ़ोन के अलावा, अन्य डिवाइसों पर भी काम करते हैं. डेस्कटॉप विंडोविंग, कनेक्ट किए गए डिसप्ले, और फ़ोल्ड किए जा सकने वाले डिवाइसों के आने के बाद, आपके कैमरा ऐप्लिकेशन को डाइनैमिक विंडो साइज़, अलग-अलग आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात), और बाहरी हार्डवेयर के हिसाब से काम करना होगा.
फ़ोन का लॉजिक क्यों काम नहीं करता
कैमरा ऐप्लिकेशन अक्सर कुछ अनुमान लगाते हैं. इससे अलग-अलग फ़ॉर्म फ़ैक्टर वाले डिवाइसों पर गंभीर समस्याएं हो सकती हैं.
नैचुरल ओरिएंटेशन
- मान्यता: डिवाइस का डिफ़ॉल्ट ओरिएंटेशन
ROTATION_0हमेशा पोर्ट्रेट होता है - असलियत: टैबलेट, कुछ फ़ोल्ड किए जा सकने वाले डिवाइसों के इनर डिसप्ले, और डेस्कटॉप मॉनिटर पर,
ROTATION_0अक्सर लैंडस्केप मोड में होता है - नतीजा: झलक में इमेज को 90 डिग्री तक गलत तरीके से घुमाया गया है
सेंसर का अलाइनमेंट
- मान्यता: कैमरा सेंसर का लंबा किनारा, स्क्रीन के लंबे किनारे के साथ अलाइन होता है
- असलियत: सेंसर के फ़िक्स्ड रहने पर, साइज़ बदलने वाली विंडो स्क्वेयर या लैंडस्केप मोड में हो सकती है. आम तौर पर, यह 4:3 होती है
- नतीजा: खींची गई या किसी और तरह से खराब की गई इमेज
स्क्रीन की डेंसिटी और साइज़
- मान्यता: स्क्रीन की डेंसिटी और साइज़, रनटाइम में नहीं बदलता
- सच्चाई: डेस्कटॉप एनवायरमेंट में, उपयोगकर्ता अपनी पसंद के हिसाब से विंडो का साइज़ बदल सकते हैं
- नतीजा: हर ड्रैग इवेंट पर कैमरा सेशन को रीस्टार्ट करने से, उपयोगकर्ता अनुभव खराब होता है और ऐप्लिकेशन क्रैश हो सकता है
पहला समाधान: सिस्टम इंटेंट का इस्तेमाल करना
अगर आपके ऐप्लिकेशन को फ़ोटो या वीडियो लेने की ज़रूरत है, लेकिन उसे खास कस्टम कैमरा इंटरफ़ेस की ज़रूरत नहीं है, तो अलग-अलग डिवाइसों के लिए सबसे सही तरीका यह है कि डिवाइस में पहले से इंस्टॉल सिस्टम कैमरा लॉन्च किया जाए. इसके बारे में जानने के लिए, कैमरा इंटेंट देखें
सिस्टम इंटेंट का इस्तेमाल करने पर, फ़ोटो कैप्चर करने की पूरी प्रोसेस, डिवाइस बनाने वाली कंपनी (ओईएम) के बनाए गए कैमरा ऐप्लिकेशन को सौंप दी जाती है. इससे, फ़ॉर्म फ़ैक्टर से जुड़ी जटिलताओं को आउटसोर्स किया जा सकता है. जैसे:
पहले से मौजूद, इमेज का साइज़ बदलने और उसे घुमाने की सुविधा — फ़ोल्ड किए जा सकने वाले डिवाइस या टैबलेट पर मौजूद डिफ़ॉल्ट कैमरा ऐप्लिकेशन को, डिवाइस बनाने वाली कंपनी ने खास तौर पर बनाया होता है. इससे, उस डिवाइस की ज्यामिति को मैनेज किया जा सकता है. ऐप्लिकेशन को इस तरह से डिज़ाइन किया गया है कि डिवाइस को खोलने, घुमाने या मल्टी-विंडो मोड में रखने पर, वह ठीक से काम करे.
हार्डवेयर की ऐडवांस सुविधाओं का ऐक्सेस — OEM के कैमरा ऐप्लिकेशन के पास, हार्डवेयर के हिसाब से ट्यून किए गए एल्गोरिदम का खास ऐक्सेस होता है. जैसे, नाइट मोड, एचडीआर, लेंस स्विच करने की सुविधा. इन्हें मैन्युअल तरीके से दोहराना मुश्किल होता है या दोहराया नहीं जा सकता.
दूसरा समाधान: Jetpack CameraX का इस्तेमाल करना
CameraX, Jetpack लाइब्रेरी है. इसे कैमरा ऐप्लिकेशन को आसानी से डेवलप करने के लिए बनाया गया है. CameraX, लाइफ़साइकल के बारे में जानता है और यह सर्फ़ेस के हिसाब से काम करता है. Camera2 के उलट, CameraX में डिवाइस को मोड़ने, घुमाने या उसका साइज़ बदलने पर, सेंसर ओरिएंटेशन और सर्फ़ेस के साइज़ को मैन्युअल तरीके से फिर से कैलकुलेट करने की ज़रूरत नहीं होती. CameraX, मल्टी-विंडो का साइज़ बदलने या किसी ऐप्लिकेशन को कनेक्ट किए गए डिसप्ले पर ले जाने के दौरान, कैमरा सेशन को अपने-आप फिर से कॉन्फ़िगर करता है. इससे यह पक्का होता है कि प्रीव्यू स्ट्रीम, बिना रुके या स्ट्रेच हुए अडजस्ट हो जाए.
PreviewView जैसे कॉम्पोनेंट, अलग-अलग स्थितियों में आसपेक्ट रेशियो और स्केल टाइप को बेहतर तरीके से मैनेज करते हैं. जैसे, फ़ोल्ड किए जा सकने वाले डिवाइस की कवर स्क्रीन से इनर स्क्रीन पर ट्रांज़िशन करना. इससे, आपको अलग-अलग तरह के हार्डवेयर के लिए एक ही तरह का कॉम्पोनेंट इस्तेमाल करने की सुविधा मिलती है. इसके लिए, आपको डिवाइस के हिसाब से अलग-अलग कॉम्पोनेंट इस्तेमाल करने की ज़रूरत नहीं होती.
Compose
Jetpack Compose के साथ, androidx.camera:camera-compose लाइब्रेरी का इस्तेमाल करें. यह लाइब्रेरी, CameraXViewfinder कंपोज़ेबल उपलब्ध कराती है. इसे खास तौर पर, Compose के लाइफ़साइकल में साइज़ बदलने, घुमाने, और आसपेक्ट रेशियो की जटिल ज्यामिति को मैनेज करने के लिए डिज़ाइन किया गया है.
CameraXViewfinder कॉम्पोनेंट, कैमरा ऐप्लिकेशन में गड़बड़ियों की सबसे आम वजहों को दूर करता है:
- अपने-आप कोऑर्डिनेट ट्रांसफ़ॉर्मेशन की सुविधा — कैमरा ऐप्लिकेशन बनाने में सबसे मुश्किल काम यह होता है कि फ़ोकस और मीटरिंग के लिए, उपयोगकर्ता के टैप (स्क्रीन पर x, y कोऑर्डिनेट) को कैमरा सेंसर के कोऑर्डिनेट सिस्टम (0-1, 0-1 रोटेट किया गया) पर मैप किया जाए.
CameraXViewfinderएकCoordinateTransformerउपलब्ध कराता है, जो गणित के सवालों को अपने-आप हल करता है. ऐसा तब भी होता है, जब विंडो का साइज़ बदला जाता है या डिवाइस को फ़ोल्ड किया जाता है. - लेआउट का सही व्यवहार —
SurfaceViewयाTextureViewके उलट,CameraXViewfinderCompose के z-ऑर्डरिंग के साथ सही तरीके से काम करता है. आर्टफ़ैक्ट रेंडर किए बिना, यूज़र इंटरफ़ेस (यूआई) एलिमेंट (फ़ोकस रिंग, कंट्रोल) ओवरले किए जा सकते हैं या मॉडिफ़ायर (कोनों को गोल करना, ऐनिमेशन) लागू किए जा सकते हैं. - रीसाइज़ करना और आसपेक्ट रेशियो:
CameraXViewfinder, सेंटर क्रॉप बनाम फ़िट सेंटर लॉजिक को अंदरूनी तौर पर मैनेज करता है. इससे यह पक्का होता है कि ऐप्लिकेशन की विंडो को नॉनस्टैंडर्ड आसपेक्ट रेशियो (उदाहरण के लिए, स्प्लिट-स्क्रीन या डेस्कटॉप विंडो मोड) में रीसाइज़ करने पर, झलक स्ट्रेच न हो.
व्यू
व्यू पर आधारित ऐप्लिकेशन के लिए, PreviewView या ViewFinderView का इस्तेमाल करें.
अगर SurfaceView या TextureView का सीधे तौर पर इस्तेमाल किया जाता है, तो आपको खुद ही आसपेक्ट रेशियो का हिसाब लगाना होगा. साथ ही, सही ट्रांसफ़ॉर्मेशन मैट्रिक्स लागू करना होगा.
तीसरा समाधान: ओरिएंटेशन और साइज़ को डाइनैमिक तरीके से मैनेज करना
प्लैटफ़ॉर्म एपीआई का सीधे तौर पर इस्तेमाल करते समय, डिवाइस रोटेशन, गतिविधि के फिर से शुरू होने, और आसपेक्ट रेशियो का ध्यान रखें.
डिवाइस को घुमाने की सुविधा का इस्तेमाल बंद करना
अपने यूज़र इंटरफ़ेस (यूआई) लेआउट का पता लगाने के लिए, सिर्फ़ Display#getRotation() या फ़िज़िकल सेंसर ओरिएंटेशन पर भरोसा न करें.
- विंडो मेट्रिक का इस्तेमाल करें —
WindowManager#getCurrentWindowMetrics()का इस्तेमाल करके, अपनी ऐप्लिकेशन विंडो की चौड़ाई और ऊंचाई की तुलना करें. इससे यह तय करें कि आपका लेआउट कैसा होगा (लैंडस्केप बनाम पोर्ट्रेट यूज़र इंटरफ़ेस). - नैचुरल ओरिएंटेशन को अनदेखा करें — ऐसा हो सकता है कि आपका ऐप्लिकेशन, लैंडस्केप मॉनिटर पर पोर्ट्रेट शेप वाली विंडो में हो. डिवाइस का ओरिएंटेशन, आपके यूज़र इंटरफ़ेस (यूआई) की सीमाओं के हिसाब से सही नहीं है.
ऐप्लिकेशन को बार-बार रीस्टार्ट करने से बचें
Android के डिफ़ॉल्ट व्यवहार के तहत, कॉन्फ़िगरेशन में बदलाव (जैसे कि विंडो का साइज़ बदलना) होने पर, आपके ऐप्लिकेशन की ऐक्टिविटी खत्म हो जाती है. कैमरा ऐप्लिकेशन के लिए, यह वीडियो कॉल के दौरान डिसप्ले के फ़्लिकर होने या कनेक्शन के बंद होने के तौर पर दिखता है.
- मेनिफ़ेस्ट कॉन्फ़िगरेशन — बिना रीस्टार्ट किए साइज़ बदलने की सुविधा को मैनेज करने के लिए, अपने मेनिफ़ेस्ट में कॉन्फ़िगरेशन में हुए बदलावों के बारे में बताएं.
- डाइनैमिक अपडेट —
onConfigurationChanged()में, नई विंडो के साइज़ से मेल खाने के लिए, कैमरे की झलक के लेआउट पैरामीटर अपडेट करें.
आस्पेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) और काटना
फ़ोल्ड किए जा सकने वाले डिवाइसों और डेस्कटॉप विंडो में, प्रीव्यू स्ट्रेच होने की समस्या आम है. इसमें 4:3 के आसपेक्ट रेशियो वाले कैमरा फ़ीड को 16:9 या 1:1 विंडो में फ़िट किया जाता है.
- स्ट्रेच न करें — अगर झलक और विंडो के आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) अलग-अलग हैं, तो कैमरे के बफ़र को व्यू बाउंड के साथ पूरी तरह से मैच करने के लिए कभी भी मजबूर न करें.
- बीच से काटना (सुझाया गया): विंडो के सबसे छोटे डाइमेंशन को भरने के लिए, झलक को स्केल करें और ज़रूरत से ज़्यादा हिस्से को काटें. इससे यह पक्का होता है कि फ़ोटो में मौजूद व्यक्ति की इमेज सही दिखे और वह फ़्रेम में पूरी तरह से दिखे.
- फ़िट सेंटर (वैकल्पिक): अगर फ़ील्ड ऑफ़ व्यू को पूरा दिखाना ज़रूरी है (उदाहरण के लिए, किसी दस्तावेज़ को स्कैन करना), तो विंडो में झलक को लेटरबॉक्स करें.
- फ़िट सेंटर (वैकल्पिक): अगर फ़ील्ड ऑफ़ व्यू को पूरा दिखाना ज़रूरी है (उदाहरण के लिए, किसी दस्तावेज़ को स्कैन करना), तो विंडो में झलक को लेटरबॉक्स करें.
बोनस: फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए बेहतर अनुभव
फ़ोल्ड किए जा सकने वाले डिवाइस सिर्फ़ ऐसे फ़ोन नहीं होते जिन्हें मोड़ा जा सकता है. इनमें हार्डवेयर की ऐसी खास सुविधाएं होती हैं जिनसे लोगों को फ़ोटो और वीडियो लेने का बेहतर अनुभव मिलता है. फ़ोल्ड को समस्या के तौर पर न देखें. इसके बजाय, इसका इस्तेमाल ऐसी सुविधाएं बनाने के लिए करें जो फ़ोल्ड न किए जा सकने वाले डिवाइसों पर उपलब्ध नहीं हैं.
टेबलटॉप मोड (डिवाइस को छुए बिना कैप्चर करना)
टेबलटॉप मोड की मदद से, उपयोगकर्ता डिवाइस को आधा मोड़कर किसी सतह पर रख सकते हैं. इससे उन्हें लंबे समय तक वीडियो कॉल करने, टाइम-लैप्स फ़ोटोग्राफ़ी करने, और रात के समय लंबे एक्सपोज़र वाली फ़ोटोग्राफ़ी करने में मदद मिलती है.
रियर-डिसप्ले मोड (अच्छी क्वालिटी की सेल्फ़ी)
- फ़ोल्ड किए जा सकने वाले डिवाइसों में, आम तौर पर पीछे के कैमरे की क्वालिटी, सामने के कैमरे की क्वालिटी से बेहतर होती है. रियर डिसप्ले मोड की मदद से, उपयोगकर्ता डिवाइस को अनफ़ोल्ड करके घुमा सकता है. साथ ही, मुख्य रियर कैमरे के लिए छोटी कवर स्क्रीन को लाइव व्यूफ़ाइंडर के तौर पर इस्तेमाल कर सकता है.
- रियर-डिसप्ले मोड की मदद से, 50 मेगापिक्सल से ज़्यादा रिज़ॉल्यूशन वाली सेल्फ़ी, अल्ट्रा-वाइड ग्रुप शॉट, और अच्छी क्वालिटी वाली व्लॉगिंग की जा सकती है. इसके लिए, आपको कोई अतिरिक्त गियर ले जाने की ज़रूरत नहीं होती.
ड्यूअल स्क्रीन मोड (विषय की झलक)
- ड्यूअल-स्क्रीन मोड की मदद से, कैमरे की झलक को इनर और आउटर, दोनों स्क्रीन पर एक साथ दिखाया जा सकता है. यह सुविधा, लोगों की फ़ोटो खींचने के लिए बेहतरीन है: फ़ोटो में दिखने वाले लोग, आउटर स्क्रीन पर खुद को देख सकते हैं और अपनी पोज़ में बदलाव कर सकते हैं जब तक कि आप इनर स्क्रीन पर फ़ोटो को फ़्रेम करते हैं.
- रियर-डिसप्ले मोड में, पूरे ऐप्लिकेशन को दूसरी स्क्रीन पर ले जाया जाता है. हालांकि, डुअल-स्क्रीन मोड में, कवर स्क्रीन पर एक सेकंडरी प्रज़ेंटेशन विंडो बनाई जाती है.