CameraX इस्तेमाल के केस का रोटेशन

इस विषय में, आपके ऐप्लिकेशन में CameraX के इस्तेमाल के उदाहरण सेट अप करने का तरीका बताया गया है. इसकी मदद से, सही रोटेशन जानकारी वाली इमेज, चाहे वह ImageAnalysis या ImageCapture के इस्तेमाल का उदाहरण. इसलिए:

  • ImageAnalysis के इस्तेमाल के उदाहरण के Analyzer को फ़्रेम के साथ, सही रोटेशन.
  • ImageCapture के इस्तेमाल के उदाहरण को सही रोटेशन के साथ फ़ोटो लेनी चाहिए.

शब्दावली

इस विषय में, नीचे दी गई शब्दावली का इस्तेमाल किया गया है. इसलिए, हर शब्द का मतलब समझना ज़रूरी है:

डिसप्ले ओरिएंटेशन
इससे यह पता चलता है कि डिवाइस का कौनसा हिस्सा ऊपर की ओर है और चार में से एक वैल्यू: पोर्ट्रेट, लैंडस्केप, रिवर्स पोर्ट्रेट या रिवर्स लैंडस्केप.
डिसप्ले का रोटेशन
यह मान दिखाता है: Display.getRotation(), और वह डिग्री दिखाता है जिससे डिवाइस को घड़ी की उलटी दिशा में घुमाया जाता है नैचुरल ओरिएंटेशन में देखा जा सकता है.
टारगेट रोटेशन
यह उन डिग्री की संख्या दिखाता है जिनसे घुमाना है डिवाइस को घड़ी की दिशा में घड़ी की सुई की दिशा में घुमाएं.

टारगेट रोटेशन का पता लगाने का तरीका

नीचे दिए गए उदाहरणों में, किसी डिवाइस के लिए टारगेट रोटेशन को तय करने का तरीका बताया गया है उसके प्राकृतिक ओरिएंटेशन के आधार पर.

उदाहरण 1: पोर्ट्रेट नैचुरल ओरिएंटेशन

डिवाइस का उदाहरण: Pixel 3 XL

नैचुरल ओरिएंटेशन = पोर्ट्रेट
मौजूदा ओरिएंटेशन = पोर्ट्रेट

डिसप्ले रोटेशन = 0
टारगेट रोटेशन = 0

नैचुरल ओरिएंटेशन = पोर्ट्रेट
मौजूदा ओरिएंटेशन = लैंडस्केप

डिसप्ले रोटेशन = 90
टारगेट रोटेशन = 90

उदाहरण 2: लैंडस्केप का नैचुरल ओरिएंटेशन

डिवाइस का उदाहरण: Pixel C

प्राकृतिक ओरिएंटेशन = लैंडस्केप
मौजूदा ओरिएंटेशन = लैंडस्केप

डिसप्ले रोटेशन = 0
टारगेट रोटेशन = 0

प्राकृतिक ओरिएंटेशन = लैंडस्केप
मौजूदा ओरिएंटेशन = पोर्ट्रेट

डिसप्ले रोटेशन = 270
टारगेट रोटेशन = 270

इमेज का रोटेशन

कौनसा समापन खत्म हो रहा है? Android में सेंसर ओरिएंटेशन को कॉन्स्टेंट के तौर पर बताया गया है वैल्यू, जो (0, 90, 180, 270) डिग्री को दिखाती है. इस वैल्यू से सेंसर को घुमाया जाता है जब डिवाइस प्राकृतिक स्थिति में हो, तब डिवाइस का सबसे ऊपर वाला हिस्सा. सभी के लिए हैं, तो इमेज रोटेशन से पता चलता है कि डेटा कैसा होना चाहिए सीधा दिखाने के लिए घड़ी की सुई की दिशा में घुमाया गया.

नीचे दिए गए उदाहरण दिखाते हैं कि इमेज का रोटेशन कैमरा सेंसर की स्क्रीन की दिशा. वे यह भी मानते हैं कि टारगेट रोटेशन डिसप्ले को घुमाना.

पहला उदाहरण: सेंसर को 90 डिग्री घुमाया गया

डिवाइस का उदाहरण: Pixel 3 XL

डिसप्ले रोटेशन = 0
डिसप्ले ओरिएंटेशन = पोर्ट्रेट
इमेज का रोटेशन = 90

डिसप्ले रोटेशन = 90
डिसप्ले ओरिएंटेशन = लैंडस्केप
इमेज का रोटेशन = 0

दूसरा उदाहरण: सेंसर को 270 डिग्री पर घुमाया गया

डिवाइस का उदाहरण: Nexus 5X

डिसप्ले रोटेशन = 0
डिसप्ले ओरिएंटेशन = पोर्ट्रेट
इमेज का रोटेशन = 270

डिसप्ले रोटेशन = 90
डिसप्ले ओरिएंटेशन = लैंडस्केप
इमेज का रोटेशन = 180

तीसरा उदाहरण: सेंसर को 0 डिग्री घुमाया गया

डिवाइस का उदाहरण: Pixel C (टैबलेट)

डिसप्ले रोटेशन = 0
डिसप्ले ओरिएंटेशन = लैंडस्केप
इमेज का रोटेशन = 0

डिसप्ले रोटेशन = 270
डिसप्ले ओरिएंटेशन = पोर्ट्रेट
इमेज का रोटेशन = 90

इमेज के रोटेशन की गणना करना

इमेज का विश्लेषण

ImageAnalysis के Analyzer को कैमरे से इस तरह की इमेज मिलती हैं ImageProxy सेकंड. हर इमेज में रोटेशन की जानकारी होती है, जिसे ऐक्सेस किया जा सकता है इनके ज़रिए:

val rotation = imageProxy.imageInfo.rotationDegrees

यह वैल्यू उन डिग्री को दिखाती है जिनके हिसाब से इमेज को घुमाना होगा ImageAnalysis के टारगेट रोटेशन से मेल खाने के लिए घड़ी की दिशा में. इसके संदर्भ में Android ऐप का ImageAnalysis का टारगेट रोटेशन आम तौर पर ऑरिएंटेशन.

इमेज कैप्चर

कैप्चर के समय सिग्नल देने के लिए, ImageCapture इंस्टेंस के साथ कॉलबैक जोड़ा जाता है नतीजा तैयार है. इसकी वजह कैप्चर की गई इमेज या कोई गड़बड़ी हो सकती है.

तस्वीर लेते समय, दिया गया कॉलबैक इनमें से एक हो सकता है प्रकार:

  • OnImageCapturedCallback: इस इमेज में, मेमोरी में मौजूद ऐक्सेस की मदद से एक इमेज मिलेगी: ImageProxy का फ़ॉर्मैट है.
  • OnImageSavedCallback: यह तब शुरू होता है, जब कैप्चर की गई इमेज का इस्तेमाल कर लिया जाता है के द्वारा निर्दिष्ट स्थान पर सफलतापूर्वक संग्रहित किया जाता है ImageCapture.OutputFileOptions. विकल्प में File, OutputStream या MediaStore में एक जगह.

कैप्चर की गई इमेज का रोटेशन, चाहे उसका फ़ॉर्मैट (ImageProxy, File, OutputStream, MediaStore Uri) रोटेशन डिग्री को कैप्चर की गई इमेज को ImageCapture से मेल खाने के लिए घड़ी की सुई की दिशा में घुमाना चाहिए टारगेट रोटेशन की सुविधा देता है, जो फिर से, Android ऐप्लिकेशन के संदर्भ में, आम तौर पर स्क्रीन के ओरिएंटेशन से मेल खाते हों.

कैप्चर की गई इमेज के रोटेशन को इनमें से किसी एक तरीके से किया जा सकता है तरीके:

ImageProxy

val rotation = imageProxy.imageInfo.rotationDegrees

File

val exif = Exif.createFromFile(file)
val rotation = exif.rotation

OutputStream

val byteArray = outputStream.toByteArray()
val exif = Exif.createFromInputStream(ByteArrayInputStream(byteArray))
val rotation = exif.rotation

MediaStore uri

val inputStream = contentResolver.openInputStream(outputFileResults.savedUri)
val exif = Exif.createFromInputStream(inputStream)
val rotation = exif.rotation

इमेज के घूमने की पुष्टि करना

ImageAnalysis और ImageCapture इस्तेमाल के उदाहरण को ImageProxy कैप्चर करने के अनुरोध के बाद कैमरा. ImageProxy में इमेज शामिल है और इसके बारे में जानकारी और इसके रोटेशन सहित इसकी जानकारी. इस रोटेशन की जानकारी वह अंश दिखाता है जिसके द्वारा चित्र को घुमाना होता है ताकि केस का टारगेट रोटेशन.

इमेज के रोटेशन की पुष्टि करने का फ़्लो

Imageकैप्चर/ImageAnalysis टारगेट रोटेशन दिशा-निर्देश

कई डिवाइस, रिवर्स पोर्ट्रेट या रिवर्स लैंडस्केप मोड में इस तरह नहीं घुमाते हैं: डिफ़ॉल्ट रूप से, कुछ Android ऐप्लिकेशन इन ओरिएंटेशन पर काम नहीं करते हैं. क्या एक ऐप्लिकेशन इसका इस्तेमाल करता है या इस्तेमाल के उदाहरणों के टारगेट रोटेशन के तरीके में बदलाव नहीं करता अपडेट किया गया.

नीचे दो टेबल दी गई हैं. इनमें बताया गया है कि इस्तेमाल के उदाहरणों के टारगेट रोटेशन को सिंक में कैसे रखा जाएगा को चालू या बंद कर सकते हैं. पहले पेज पर, चार ओरिएंटेशन; दूसरा सिर्फ़ उन ओरिएंटेशन को हैंडल करता है जिनमें डिवाइस घुमाता है डिफ़ॉल्ट रूप से.

यह चुनने के लिए कि आपको अपने ऐप्लिकेशन में किन दिशा-निर्देशों का पालन करना है:

  1. यह पुष्टि करें कि आपके ऐप्लिकेशन के कैमरे Activity का ओरिएंटेशन लॉक है या नहीं, अनलॉक किया गया ओरिएंटेशन या अगर यह ओरिएंटेशन के कॉन्फ़िगरेशन में किए गए बदलावों को बदलता है.

  2. यह तय करें कि आपके ऐप्लिकेशन के कैमरे Activity को चारों डिवाइस का इस्तेमाल करना चाहिए या नहीं ओरिएंटेशन (पोर्ट्रेट, रिवर्स पोर्ट्रेट, लैंडस्केप, और रिवर्स लैंडस्केप), इसके अलावा, डिवाइस का सिर्फ़ ओरिएंटेशन हैंडल किया जा सकता है, जिस पर यह चल रहा है डिफ़ॉल्ट रूप से.

सभी चार ओरिएंटेशन (स्क्रीन की दिशा) का इस्तेमाल करें

इस टेबल में कुछ दिशा-निर्देशों के बारे में बताया गया है, जिनका पालन करना तब ज़रूरी होता है, जब डिवाइस फ़ोटो को रिवर्स पोर्ट्रेट में नहीं घुमाता. यह तरीका उन डिवाइसों पर भी लागू किया जा सकता है जिन पर घुमाते नहीं हैं.

स्थिति दिशा-निर्देश सिंगल-विंडो मोड मल्टी-विंडो स्प्लिट स्क्रीन मोड
अनलॉक किया गया ओरिएंटेशन इस्तेमाल के उदाहरण सेट अप करें Activity को बनाने का समय, जैसे कि Activity का onCreate() कॉलबैक.
OrientationEventListener की onOrientationChanged(). कॉलबैक के अंदर, इस्तेमाल के उदाहरणों के टारगेट रोटेशन को अपडेट करें. यह उन मामलों में कार्रवाई करता है जहां सिस्टम काम नहीं करता स्क्रीन की दिशा बदलने के बाद भी Activity को फिर से बनाएं, जैसे जब डिवाइस को 180 डिग्री घुमाया जाता है. डिस्प्ले के उलटे क्रम में होने पर भी हैंडल कर सकता है पोर्ट्रेट ओरिएंटेशन में और डिवाइस को घुमाकर रिवर्स पोर्ट्रेट मोड में नहीं घुमाया जाता डिफ़ॉल्ट. उन मामलों को भी हैंडल करता है जहां Activity नहीं है डिवाइस के घूमने पर फिर से बनाया जाता है (उदाहरण के लिए, 90 डिग्री). यह इस पर होता है जब ऐप्लिकेशन आधी स्क्रीन पर और बड़े साइज़ में, छोटे साइज़ के डिवाइस लेता है डिवाइस की स्क्रीन का दो तिहाई हिस्सा इस्तेमाल करने पर.
ज़रूरी नहीं: Activity के screenOrientation को सेट करें AndroidManifest के लिए fullSensor प्रॉपर्टी फ़ाइल से लिए जाते हैं. इससे डिवाइस के रिवर्स में होने पर यूज़र इंटरफ़ेस (यूआई) को सीधा रखने में मदद मिलती है पोर्ट्रेट, और इसकी मदद से Activity को फिर से बनाया जा सकता है. सिस्टम को 90 डिग्री घुमाया जाएगा. इसका उन डिवाइसों पर कोई असर नहीं पड़ता है जो रिवर्स पोर्ट्रेट मोड में घुमाकर नहीं बदलते डिफ़ॉल्ट. मल्टी-विंडो मोड काम नहीं करता, जब डिसप्ले रिवर्स पोर्ट्रेट ओरिएंटेशन.
लॉक किया गया ओरिएंटेशन इस्तेमाल के उदाहरण सिर्फ़ एक बार सेट अप करें, जब Activity को सबसे पहले बनाया गया, जैसे कि Activity में onCreate() कॉलबैक.
OrientationEventListener की onOrientationChanged(). कॉलबैक के अंदर, 'झलक देखें' को छोड़कर, इस्तेमाल के उदाहरणों के टारगेट रोटेशन को अपडेट करें. उन मामलों को भी हैंडल करता है जहां Activity नहीं है डिवाइस के घूमने पर फिर से बनाया जाता है (उदाहरण के लिए, 90 डिग्री). यह इस पर होता है जब ऐप्लिकेशन आधी स्क्रीन पर और बड़े साइज़ में, छोटे साइज़ के डिवाइस लेता है डिवाइस की स्क्रीन का दो तिहाई हिस्सा इस्तेमाल करने पर.
ओरिएंटेशन कॉन्फ़िगरेशन में बदलाव किया गया इस्तेमाल के उदाहरण सिर्फ़ एक बार सेट अप करें, जब Activity को सबसे पहले बनाया गया, जैसे कि Activity में onCreate() कॉलबैक.
OrientationEventListener की onOrientationChanged(). कॉलबैक के अंदर, इस्तेमाल के उदाहरणों के टारगेट रोटेशन को अपडेट करें. उन मामलों को भी हैंडल करता है जहां Activity नहीं है डिवाइस के घूमने पर फिर से बनाया जाता है (उदाहरण के लिए, 90 डिग्री). यह इस पर होता है जब ऐप्लिकेशन आधी स्क्रीन पर और बड़े साइज़ में, छोटे साइज़ के डिवाइस लेता है डिवाइस की स्क्रीन का दो तिहाई हिस्सा इस्तेमाल करने पर.
ज़रूरी नहीं: ऐक्टिविटी की screenOrientation प्रॉपर्टी को FullSensor पर सेट करें AndroidManifest फ़ाइल में. डिवाइस के रिवर्स पोर्ट्रेट में होने पर, यूज़र इंटरफ़ेस (यूआई) को सीधा रखने की अनुमति देता है. इसका उन डिवाइसों पर कोई असर नहीं पड़ता है जो रिवर्स पोर्ट्रेट मोड में घुमाकर नहीं बदलते डिफ़ॉल्ट. मल्टी-विंडो मोड काम नहीं करता, जब डिसप्ले रिवर्स पोर्ट्रेट ओरिएंटेशन.

सिर्फ़ डिवाइस के साथ काम करने वाले ओरिएंटेशन का इस्तेमाल किया जा सकता है

सिर्फ़ उन ओरिएंटेशन के साथ काम करता है जिन पर डिवाइस डिफ़ॉल्ट रूप से काम करता है. ऐसा हो सकता है कि रिवर्स पोर्ट्रेट/रिवर्स लैंडस्केप शामिल नहीं होना चाहिए).

स्थिति दिशा-निर्देश मल्टी-विंडो स्प्लिट स्क्रीन मोड
अनलॉक किया गया ओरिएंटेशन इस्तेमाल के उदाहरण सेट अप करें Activity को बनाने का समय, जैसे कि Activity का onCreate() कॉलबैक.
DisplayListener की onDisplayChanged(). कॉलबैक न करें, तो इस्तेमाल के उदाहरणों के टारगेट रोटेशन को अपडेट करें, जैसे कि जब डिवाइस को 180 डिग्री पर घुमाया गया है. उन मामलों को भी हैंडल करता है जहां Activity नहीं है डिवाइस के घूमने पर फिर से बनाया जाता है (उदाहरण के लिए, 90 डिग्री). यह इस पर होता है जब ऐप्लिकेशन आधी स्क्रीन पर और बड़े साइज़ में, छोटे साइज़ के डिवाइस लेता है डिवाइस की स्क्रीन का दो तिहाई हिस्सा इस्तेमाल करने पर.
लॉक किया गया ओरिएंटेशन इस्तेमाल के उदाहरण सिर्फ़ एक बार सेट अप करें, जब Activity को सबसे पहले बनाया गया, जैसे कि Activity में onCreate() कॉलबैक.
OrientationEventListener की onOrientationChanged(). कॉलबैक के अंदर, इस्तेमाल के उदाहरणों के टारगेट रोटेशन को अपडेट करें. उन मामलों को भी हैंडल करता है जहां Activity नहीं है डिवाइस के घूमने पर फिर से बनाया जाता है (उदाहरण के लिए, 90 डिग्री). यह इस पर होता है जब ऐप्लिकेशन आधी स्क्रीन पर और बड़े साइज़ में, छोटे साइज़ के डिवाइस लेता है डिवाइस की स्क्रीन का दो तिहाई हिस्सा इस्तेमाल करने पर.
ओरिएंटेशन कॉन्फ़िगरेशन में बदलाव किया गया इस्तेमाल के उदाहरण सिर्फ़ एक बार सेट अप करें, जब Activity को सबसे पहले बनाया गया, जैसे कि Activity में onCreate() कॉलबैक.
DisplayListener की onDisplayChanged(). कॉलबैक न करें, तो इस्तेमाल के उदाहरणों के टारगेट रोटेशन को अपडेट करें, जैसे कि जब डिवाइस को 180 डिग्री पर घुमाया गया है. उन मामलों को भी हैंडल करता है जहां Activity नहीं है डिवाइस के घूमने पर फिर से बनाया जाता है (उदाहरण के लिए, 90 डिग्री). यह इस पर होता है जब ऐप्लिकेशन आधी स्क्रीन पर और बड़े साइज़ में, छोटे साइज़ के डिवाइस लेता है डिवाइस की स्क्रीन का दो तिहाई हिस्सा इस्तेमाल करने पर.

अनलॉक किया गया ओरिएंटेशन

जब Activity का डिसप्ले ओरिएंटेशन होता है, तो उसका ओरिएंटेशन अनलॉक हो जाता है (जैसे कि पोर्ट्रेट या लैंडस्केप) डिवाइस के फ़िज़िकल ओरिएंटेशन से मैच हो रही है. जैसे, रिवर्स पोर्ट्रेट/लैंडस्केप का अपवाद, जो कुछ डिवाइस पर काम नहीं करता डिफ़ॉल्ट रूप से. डिवाइस को सभी चारों ओरिएंटेशन पर घुमाने के लिए, fullSensor के लिए Activity की screenOrientation प्रॉपर्टी.

मल्टी-विंडो मोड में, रिवर्स पोर्ट्रेट/लैंडस्केप के साथ काम न करने वाला डिवाइस डिफ़ॉल्ट रूप से रिवर्स पोर्ट्रेट/लैंडस्केप में नहीं घूमेगा, भले ही screenOrientation प्रॉपर्टी को fullSensor पर सेट किया गया है.

<!-- The Activity has an unlocked orientation, but might not rotate to reverse
portrait/landscape in single-window mode if the device doesn't support it by
default. -->
<activity android:name=".UnlockedOrientationActivity" />

<!-- The Activity has an unlocked orientation, and will rotate to all four
orientations in single-window mode. -->
<activity
   android:name=".UnlockedOrientationActivity"
   android:screenOrientation="fullSensor" />

स्क्रीन की दिशा लॉक की गई

डिसप्ले के एक जैसे डिसप्ले ओरिएंटेशन में रहने पर, स्क्रीन लॉक है (जैसे कि पोर्ट्रेट या लैंडस्केप) डिवाइस. Activity की screenOrientation तय करके ऐसा किया जा सकता है प्रॉपर्टी की जानकारी AndroidManifest.xml फ़ाइल में दी गई है.

डिसप्ले की स्क्रीन की दिशा लॉक होने पर, सिस्टम बंद नहीं होता और डिवाइस को घुमाते समय, Activity को फिर से बनाएं.

<!-- The Activity keeps a portrait orientation even as the device rotates. -->
<activity
   android:name=".LockedOrientationActivity"
   android:screenOrientation="portrait" />

ओरिएंटेशन कॉन्फ़िगरेशन में बदलाव किया गया

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

<!-- The Activity's UI might not rotate in reverse portrait/landscape if the
device doesn't support it by default. -->
<activity
   android:name=".OrientationConfigChangesOverriddenActivity"
   android:configChanges="orientation|screenSize" />

<!-- The Activity's UI will rotate to all 4 orientations in single-window
mode. -->
<activity
   android:name=".OrientationConfigChangesOverriddenActivity"
   android:configChanges="orientation|screenSize"
   android:screenOrientation="fullSensor" />

कैमरे के इस्तेमाल के उदाहरण सेट अप करना

ऊपर बताए गए मामलों में, कैमरे के इस्तेमाल के उदाहरण तब सेट अप किए जा सकते हैं, जब Activity को सबसे पहले बनाया गया.

अनलॉक किए गए ओरिएंटेशन वाले Activity के मामले में, यह सेटअप पूरा हो जाता है जब भी डिवाइस को घुमाया जाता है, तो सिस्टम उसे नष्ट करता है और फिर से ओरिएंटेशन बदलने पर Activity. इससे इस्तेमाल के उदाहरण के तौर पर, टारगेट रोटेशन को हर बार डिफ़ॉल्ट रूप से डिसप्ले के ओरिएंटेशन से मैच करने के लिए सेट करें.

अगर Activity के ओरिएंटेशन को लॉक किया गया है या जो ओवरराइड करता है ओरिएंटेशन कॉन्फ़िगरेशन में बदलाव होता है. यह सेटअप एक बार पूरा होता है, जब Activity सबसे पहले बनाया जाता है.

class CameraActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)

       val cameraProcessFuture = ProcessCameraProvider.getInstance(this)
       cameraProcessFuture.addListener(Runnable {
          val cameraProvider = cameraProcessFuture.get()

          // By default, the use cases set their target rotation to match the
          // display’s rotation.
          val preview = buildPreview()
          val imageAnalysis = buildImageAnalysis()
          val imageCapture = buildImageCapture()

          cameraProvider.bindToLifecycle(
              this, cameraSelector, preview, imageAnalysis, imageCapture)
       }, mainExecutor)
   }
}

OrientationEventListener का सेटअप

OrientationEventListener का इस्तेमाल करने पर, टारगेट को लगातार अपडेट किया जा सकता है डिवाइस का ओरिएंटेशन बदलने पर, कैमरे को इस्तेमाल करने के उदाहरणों को घुमाना.

class CameraActivity : AppCompatActivity() {

    private val orientationEventListener by lazy {
        object : OrientationEventListener(this) {
            override fun onOrientationChanged(orientation: Int) {
                if (orientation == ORIENTATION_UNKNOWN) {
                    return
                }

                val rotation = when (orientation) {
                     in 45 until 135 -> Surface.ROTATION_270
                     in 135 until 225 -> Surface.ROTATION_180
                     in 225 until 315 -> Surface.ROTATION_90
                     else -> Surface.ROTATION_0
                 }

                 imageAnalysis.targetRotation = rotation
                 imageCapture.targetRotation = rotation
            }
        }
    }

    override fun onStart() {
        super.onStart()
        orientationEventListener.enable()
    }

    override fun onStop() {
        super.onStop()
        orientationEventListener.disable()
    }
}

DisplayListener का सेटअप

DisplayListener का इस्तेमाल करके, कैमरे का टारगेट रोटेशन अपडेट किया जा सकता है कुछ स्थितियों में इस्तेमाल के उदाहरण, जैसे कि सिस्टम पूरी तरह से बंद नहीं होता और डिवाइस को 180 डिग्री घुमाने के बाद, Activity को फिर से बनाएं.

class CameraActivity : AppCompatActivity() {

    private val displayListener = object : DisplayManager.DisplayListener {
        override fun onDisplayChanged(displayId: Int) {
            if (rootView.display.displayId == displayId) {
                val rotation = rootView.display.rotation
                imageAnalysis.targetRotation = rotation
                imageCapture.targetRotation = rotation
            }
        }

        override fun onDisplayAdded(displayId: Int) {
        }

        override fun onDisplayRemoved(displayId: Int) {
        }
    }

    override fun onStart() {
        super.onStart()
        val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
        displayManager.registerDisplayListener(displayListener, null)
    }

    override fun onStop() {
        super.onStop()
        val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
        displayManager.unregisterDisplayListener(displayListener)
    }
}