अलग-अलग डिवाइसों पर कैमरे की सुविधा काम करती है

Android ऐप्लिकेशन, सिर्फ़ पोर्ट्रेट मोड में पकड़े जाने वाले फ़ोन के अलावा, अन्य फ़ॉर्म फ़ैक्टर पर भी काम करते हैं. डेस्कटॉप विंडोइंग, कनेक्टेड डिसप्ले, और फ़ोल्ड होने वाले डिवाइसों के आने के बाद, आपके कैमरा ऐप्लिकेशन को डाइनैमिक विंडो साइज़, अलग-अलग आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) और बाहरी हार्डवेयर के हिसाब से काम करना होगा.

पहली इमेज. अलग-अलग डिसप्ले पर कैमरा ऐप्लिकेशन के उदाहरण.

फ़ोन की लॉजिक में गड़बड़ी की वजह

कैमरा ऐप्लिकेशन अक्सर कुछ ऐसे अनुमानों के आधार पर काम करते हैं जिनकी वजह से, एक से ज़्यादा फ़ॉर्म फ़ैक्टर वाले एनवायरमेंट में गंभीर गड़बड़ियां हो सकती हैं.

नैचुरल ओरिएंटेशन

  • अनुमान: डिवाइस का नैचुरल ओरिएंटेशन ROTATION_0 हमेशा पोर्ट्रेट होता है
  • सच्चाई: टैबलेट, कुछ फ़ोल्ड होने वाले डिवाइसों के इनर डिसप्ले, और डेस्कटॉप मॉनिटर पर, ROTATION_0 अक्सर लैंडस्केप होता है
  • नतीजा: झलक 90 डिग्री पर गलत तरीके से रोटेट होती है
दूसरी इमेज. सही रोटेशन लागू करने से पहले और बाद में, कैमरा व्यूफ़ाइंडर.

सेंसर अलाइनमेंट

  • अनुमान: कैमरा सेंसर का लंबा किनारा, स्क्रीन के लंबे किनारे के साथ अलाइन होता है
  • सच्चाई: साइज़ बदलने वाली विंडो, चौकोर या लैंडस्केप हो सकती है. वहीं, सेंसर अपनी जगह पर फ़िक्स रहता है. आम तौर पर, यह 4:3 होता है
  • नतीजा: इमेज स्ट्रेच हो जाती हैं या उनमें किसी तरह की गड़बड़ी आ जाती है
तीसरी इमेज. सही स्केलिंग फ़ैक्टर लागू करने से पहले और बाद में, कैमरा व्यूफ़ाइंडर.

स्क्रीन की डेंसिटी और साइज़

  • अनुमान: रनटाइम के दौरान, स्क्रीन की डेंसिटी और साइज़ में कोई बदलाव नहीं होता
  • सच्चाई: डेस्कटॉप एनवायरमेंट में, उपयोगकर्ता विंडो का साइज़ अपनी ज़रूरत के हिसाब से बदल सकते हैं
  • नतीजा: हर ड्रैग इवेंट पर, कैमरा सेशन को रीस्टार्ट करने से उपयोगकर्ता अनुभव में रुकावट आती है और ऐप्लिकेशन क्रैश हो सकते हैं

पहला समाधान: सिस्टम इंटेंट का इस्तेमाल करना

अगर आपके ऐप्लिकेशन को फ़ोटो या वीडियो लेना है, लेकिन इसके लिए किसी खास कस्टम कैमरा इंटरफ़ेस की ज़रूरत नहीं है, तो अलग-अलग फ़ॉर्म फ़ैक्टर को हैंडल करने का सबसे अच्छा तरीका है कि डिवाइस में पहले से इंस्टॉल किए गए सिस्टम कैमरे को लॉन्च किया जाए. इसके लिए, कैमरा इंटेंट देखें

सिस्टम इंटेंट का इस्तेमाल करने पर, कैप्चर करने की पूरी प्रोसेस, डिवाइस के ओरिजनल इक्विपमेंट मैन्युफ़ैक्चरर (ओईएम) के बनाए गए कैमरा ऐप्लिकेशन पर निर्भर करती है. इससे, फ़ॉर्म फ़ैक्टर की सहायता से जुड़ी जटिलता को आउटसोर्स किया जा सकता है. इसमें ये शामिल हैं:

  • साइज़ बदलने और रोटेशन की सुविधा — फ़ोल्ड होने वाले डिवाइस या टैबलेट पर मौजूद डिफ़ॉल्ट कैमरा ऐप्लिकेशन को, मैन्युफ़ैक्चरर ने खास तौर पर उस डिवाइस की ज्यामिति को हैंडल करने के लिए बनाया है. ऐप्लिकेशन को इस तरह डिज़ाइन किया गया है कि डिवाइस को अनफ़ोल्ड करने, रोटेट करने या मल्टी-विंडो मोड में रखने पर, वह सही तरीके से काम करे.
  • ऐडवांस हार्डवेयर सुविधाओं का ऐक्सेस — ओईएम कैमरा ऐप्लिकेशन के पास, हार्डवेयर-ट्यून किए गए एल्गोरिदम (नाइट मोड, एचडीआर, खास लेंस स्विचिंग) का खास ऐक्सेस होता है. इन्हें मैन्युअल तरीके से रेप्लिकेट करना मुश्किल या नामुमकिन होता है.

दूसरा समाधान: Jetpack CameraX का इस्तेमाल करना

CameraX, Jetpack लाइब्रेरी है. इसे कैमरा ऐप्लिकेशन के डेवलपमेंट को आसान बनाने के लिए बनाया गया है. CameraX, लाइफ़साइकल के बारे में जानकारी रखता है और यह सरफेस ओरिएंटेड है. Camera2 के उलट, CameraX में डिवाइस को फ़ोल्ड करने, रोटेट करने या साइज़ बदलने पर, सेंसर ओरिएंटेशन और सरफेस साइज़ की मैन्युअल तरीके से फिर से गिनती करने की ज़रूरत नहीं होती. CameraX, मल्टी-विंडो का साइज़ बदलने या किसी ऐप्लिकेशन को कनेक्टेड डिसप्ले पर ले जाने के दौरान, कैमरा सेशन के रीकॉन्फ़िगरेशन को अपने-आप हैंडल करता है. इससे, झलक वाली स्ट्रीम बिना किसी रुकावट या स्ट्रेचिंग के अडैप्ट होती है.

PreviewView जैसे कॉम्पोनेंट, अलग-अलग स्थितियों में आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) और स्केल टाइप को बेहतर तरीके से मैनेज करते हैं. जैसे, फ़ोल्ड होने वाला डिवाइस, कवर स्क्रीन से इनर स्क्रीन पर ट्रांज़िशन करता है. इससे, डिवाइस के हिसाब से अलग-अलग एज केस के जटिल कलेक्शन के बजाय, एक ही तरीके से लागू करके, अलग-अलग तरह के हार्डवेयर के लिए सहायता दी जा सकती है.

Compose

Jetpack Compose के साथ, समर्पित androidx.camera:camera-compose लाइब्रेरी का इस्तेमाल करें. यह लाइब्रेरी, CameraXViewfinder कंपोज़ेबल उपलब्ध कराती है. इसे खास तौर पर, साइज़ बदलने, रोटेशन, और आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) की जटिल ज्यामिति को हैंडल करने के लिए डिज़ाइन किया गया है.

CameraXViewfinder कॉम्पोनेंट, कैमरा ऐप्लिकेशन में होने वाली गड़बड़ियों के सबसे आम सोर्स को खत्म करता है:

  • कोऑर्डिनेट का अपने-आप ट्रांसफ़ॉर्मेशन — कैमरा ऐप्लिकेशन बनाने का सबसे मुश्किल हिस्सा, फ़ोकस और मीटरिंग के लिए, उपयोगकर्ता के टैप (स्क्रीन पर x, y कोऑर्डिनेट) को कैमरा सेंसर के कोऑर्डिनेट सिस्टम (0-1, 0-1 रोटेट किया गया) पर मैप करना है. CameraXViewfinder उपलब्ध कराता है. यह गणित को अपने-आप हैंडल करता है. ऐसा तब भी होता है, जब विंडो का साइज़ बदला जाता है या डिवाइस को फ़ोल्ड किया जाता है.CoordinateTransformer
  • सही लेआउट बिहेवियरSurfaceView या TextureView के उलट, CameraXViewfinder, Compose के z-ऑर्डरिंग के साथ सही तरीके से काम करता है. आर्टफ़ैक्ट रेंडर किए बिना, यूज़र इंटरफ़ेस (यूआई) एलिमेंट (फ़ोकस रिंग, कंट्रोल) को ओवरले किया जा सकता है या मॉडिफ़ायर (कोने राउंड करना, ऐनिमेशन) लागू किए जा सकते हैं.
  • साइज़ बदलना और आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात): CameraXViewfinder इंटरनली सेंटर क्रॉप बनाम फ़िट सेंटर लॉजिक को हैंडल करता है. इससे यह पक्का होता है कि ऐप्लिकेशन विंडो का साइज़, नॉन-स्टैंडर्ड आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) (उदाहरण के लिए, स्प्लिट-स्क्रीन या डेस्कटॉप विंडोइंग मोड) में बदलने पर, झलक स्ट्रेच न हो.

Views

व्यू पर आधारित ऐप्लिकेशन में, PreviewView या ViewFinderView का इस्तेमाल करें. अगर सीधे SurfaceView या TextureView का इस्तेमाल किया जाता है, तो आपको आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) की गिनती करनी होगी और सही ट्रांसफ़ॉर्मेशन मैट्रिक्स को खुद लागू करना होगा.

तीसरा समाधान: ओरिएंटेशन और साइज़ बदलने की सुविधा को डाइनैमिक तरीके से हैंडल करना

प्लैटफ़ॉर्म एपीआई का सीधे तौर पर इस्तेमाल करते समय, डिवाइस रोटेशन, ऐक्टिविटी रीस्टार्ट, और आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) को ध्यान में रखें.

डिवाइस रोटेशन का इस्तेमाल बंद करना

यूज़र इंटरफ़ेस (यूआई) लेआउट तय करने के लिए, सिर्फ़ Display#getRotation() या फ़िज़िकल सेंसर ओरिएंटेशन पर निर्भर न रहें.

  • विंडो मेट्रिक का इस्तेमाल करनाWindowManager#getCurrentWindowMetrics() का इस्तेमाल करके, ऐप्लिकेशन विंडो की चौड़ाई और ऊंचाई की तुलना करके, अपना लेआउट (लैंडस्केप बनाम पोर्ट्रेट यूज़र इंटरफ़ेस (यूआई)) तय करें.
  • नैचुरल ओरिएंटेशन को अनदेखा करना — ऐसा हो सकता है कि आपका ऐप्लिकेशन, लैंडस्केप मॉनिटर पर पोर्ट्रेट आकार वाली विंडो में हो. डिवाइस ओरिएंटेशन, यूज़र इंटरफ़ेस (यूआई) की सीमाओं के लिए ज़रूरी नहीं है.

ऐक्टिविटी रीस्टार्ट से बचना

डिफ़ॉल्ट Android बिहेवियर, कॉन्फ़िगरेशन में बदलाव (जैसे, विंडो का साइज़ बदलना) होने पर, आपके ऐप्लिकेशन की ऐक्टिविटी को खत्म कर देता है. कैमरा ऐप्लिकेशन के लिए, यह वीडियो कॉल के दौरान, डिसप्ले फ़्लिकर या कनेक्शन ड्रॉप के तौर पर दिखता है.

आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) और क्रॉपिंग

फ़ोल्ड होने वाले डिवाइसों और डेस्कटॉप विंडो में, प्रीव्यू स्ट्रेचिंग एक आम समस्या है. इसमें, 4:3 कैमरा फ़ीड को 16:9 या 1:1 विंडो में फ़ोर्स किया जाता है.

  • स्ट्रेच न करना — अगर प्रीव्यू और विंडो के आसपेक्ट रेशियो (चौड़ाई-ऊंचाई का अनुपात) अलग-अलग हैं, तो कैमरा बफ़र को व्यू की सीमाओं से मैच करने के लिए कभी भी फ़ोर्स न करें.
  • सेंटर क्रॉप (सुझाया गया): विंडो के सबसे छोटे डाइमेंशन को भरने के लिए, प्रीव्यू को स्केल करें और बाकी हिस्से को क्रॉप करें. इससे यह पक्का होता है कि सब्जेक्ट में कोई गड़बड़ी नहीं है और वह फ़्रेम को भरता है.
  • फ़िट सेंटर (वैकल्पिक): अगर व्यू के पूरे फ़ील्ड को दिखाना ज़रूरी है (उदाहरण के लिए, किसी दस्तावेज़ को स्कैन करना), तो विंडो के अंदर प्रीव्यू को लेटरबॉक्स करें.

बोनस: फ़ोल्ड होने वाले डिवाइसों के लिए, खास तौर पर डिज़ाइन किए गए अनुभव की सुविधा

फ़ोल्ड होने वाले डिवाइस, सिर्फ़ ऐसे फ़ोन नहीं हैं जिन्हें मोड़ा जा सकता है. इनमें हार्डवेयर की ऐसी खास स्थितियां भी होती हैं जिनसे उपयोगकर्ता, फ़ोटो और वीडियो लेने के तरीके को बेहतर बना सकते हैं. फ़ोल्ड होने की सुविधा को समस्या के तौर पर न देखें. इसके बजाय, इसका इस्तेमाल ऐसी सुविधाएं बनाने के लिए करें जो फ़ोल्ड न होने वाले डिवाइसों पर उपलब्ध नहीं हैं.

टेबलटॉप मोड (डिवाइस को छुए बिना कैप्चर करना)

टेबलटॉप मोड की मदद से, उपयोगकर्ता डिवाइस को आधा फ़ोल्ड करके, किसी सतह पर रख सकते हैं. इससे, वीडियो कॉल, टाइम-लैप्स फ़ोटोग्राफ़ी, और लॉन्ग-एक्सपोज़र नाइट फ़ोटोग्राफ़ी की जा सकती है.

पांचवी इमेज. टेबलटॉप मोड में, एक कम्यूनिकेशन ऐप्लिकेशन: कैमरा व्यूफ़ाइंडर, हिंज के सबसे ऊपर है और कंट्रोल सबसे नीचे हैं.

रियर-डिसप्ले मोड (अच्छी क्वालिटी वाली सेल्फ़ी)

  • फ़ोल्ड होने वाले डिवाइसों पर, रियर कैमरे आम तौर पर, उपयोगकर्ता की ओर वाले कैमरों से बेहतर क्वालिटी के होते हैं. रियर डिसप्ले मोड की मदद से, उपयोगकर्ता डिवाइस को अनफ़ोल्ड करके घुमा सकते हैं. साथ ही, मुख्य रियर कैमरे के लिए, छोटी कवर स्क्रीन को लाइव व्यूफ़ाइंडर के तौर पर इस्तेमाल कर सकते हैं.
  • रियर-डिसप्ले मोड की मदद से, 50 मेगापिक्सल या इससे ज़्यादा रिज़ॉल्यूशन वाली सेल्फ़ी, अल्ट्रा-वाइड ग्रुप शॉट, और अच्छी क्वालिटी वाली व्लॉगिंग की जा सकती है. इसके लिए, अलग से गियर ले जाने की ज़रूरत नहीं होती.

ड्यूअल-स्क्रीन मोड (सब्जेक्ट प्रीव्यू)

  • ड्यूल-स्क्रीन मोड की मदद से, इनर और आउटर दोनों स्क्रीन पर, कैमरा प्रीव्यू एक साथ दिखाया जा सकता है. यह लोगों की फ़ोटो लेने के लिए सबसे सही है: फ़ोटो के सब्जेक्ट, आउटर स्क्रीन पर खुद को देख सकते हैं और पोज़ को अडजस्ट कर सकते हैं. वहीं, आप इनर स्क्रीन पर शॉट को फ़्रेम कर सकते हैं.
  • रियर-डिसप्ले मोड (जिसमें पूरा ऐप्लिकेशन दिखता है) के उलट, ड्यूअल-स्क्रीन मोड, कवर स्क्रीन पर सेकंडरी प्रेजेंटेशन विंडो बनाता है.
पांचवी इमेज. ड्यूअल-स्क्रीन मोड में, एक कैमरा ऐप्लिकेशन.