इस विषय में, आपके ऐप्लिकेशन में CameraX के इस्तेमाल के उदाहरण सेट अप करने का तरीका बताया गया है. इसकी मदद से,
सही रोटेशन जानकारी वाली इमेज, चाहे वह
ImageAnalysis
या ImageCapture
के इस्तेमाल का उदाहरण. इसलिए:
ImageAnalysis
के इस्तेमाल के उदाहरण केAnalyzer
को फ़्रेम के साथ, सही रोटेशन.ImageCapture
के इस्तेमाल के उदाहरण को सही रोटेशन के साथ फ़ोटो लेनी चाहिए.
शब्दावली
इस विषय में, नीचे दी गई शब्दावली का इस्तेमाल किया गया है. इसलिए, हर शब्द का मतलब समझना ज़रूरी है:
- डिसप्ले ओरिएंटेशन
- इससे यह पता चलता है कि डिवाइस का कौनसा हिस्सा ऊपर की ओर है और चार में से एक वैल्यू: पोर्ट्रेट, लैंडस्केप, रिवर्स पोर्ट्रेट या रिवर्स लैंडस्केप.
- डिसप्ले का रोटेशन
- यह मान दिखाता है:
Display.getRotation()
, और वह डिग्री दिखाता है जिससे डिवाइस को घड़ी की उलटी दिशा में घुमाया जाता है नैचुरल ओरिएंटेशन में देखा जा सकता है. - टारगेट रोटेशन
- यह उन डिग्री की संख्या दिखाता है जिनसे घुमाना है डिवाइस को घड़ी की दिशा में घड़ी की सुई की दिशा में घुमाएं.
टारगेट रोटेशन का पता लगाने का तरीका
नीचे दिए गए उदाहरणों में, किसी डिवाइस के लिए टारगेट रोटेशन को तय करने का तरीका बताया गया है उसके प्राकृतिक ओरिएंटेशन के आधार पर.
उदाहरण 1: पोर्ट्रेट नैचुरल ओरिएंटेशन
डिवाइस का उदाहरण: Pixel 3 XL | |
---|---|
नैचुरल ओरिएंटेशन = पोर्ट्रेट डिसप्ले रोटेशन = 0 |
![]() |
नैचुरल ओरिएंटेशन = पोर्ट्रेट डिसप्ले रोटेशन = 90 |
![]() |
उदाहरण 2: लैंडस्केप का नैचुरल ओरिएंटेशन
डिवाइस का उदाहरण: Pixel C | |
---|---|
प्राकृतिक ओरिएंटेशन = लैंडस्केप डिसप्ले रोटेशन = 0 |
![]() |
प्राकृतिक ओरिएंटेशन = लैंडस्केप डिसप्ले रोटेशन = 270 |
![]() |
इमेज का रोटेशन
कौनसा समापन खत्म हो रहा है? Android में सेंसर ओरिएंटेशन को कॉन्स्टेंट के तौर पर बताया गया है वैल्यू, जो (0, 90, 180, 270) डिग्री को दिखाती है. इस वैल्यू से सेंसर को घुमाया जाता है जब डिवाइस प्राकृतिक स्थिति में हो, तब डिवाइस का सबसे ऊपर वाला हिस्सा. सभी के लिए हैं, तो इमेज रोटेशन से पता चलता है कि डेटा कैसा होना चाहिए सीधा दिखाने के लिए घड़ी की सुई की दिशा में घुमाया गया.
नीचे दिए गए उदाहरण दिखाते हैं कि इमेज का रोटेशन कैमरा सेंसर की स्क्रीन की दिशा. वे यह भी मानते हैं कि टारगेट रोटेशन डिसप्ले को घुमाना.
पहला उदाहरण: सेंसर को 90 डिग्री घुमाया गया
डिवाइस का उदाहरण: Pixel 3 XL | |
---|---|
डिसप्ले रोटेशन = 0 |
|
डिसप्ले रोटेशन = 90 |
|
दूसरा उदाहरण: सेंसर को 270 डिग्री पर घुमाया गया
डिवाइस का उदाहरण: Nexus 5X | |
---|---|
डिसप्ले रोटेशन = 0 |
|
डिसप्ले रोटेशन = 90 |
|
तीसरा उदाहरण: सेंसर को 0 डिग्री घुमाया गया
डिवाइस का उदाहरण: Pixel C (टैबलेट) | |
---|---|
डिसप्ले रोटेशन = 0 |
|
डिसप्ले रोटेशन = 270 |
|
इमेज के रोटेशन की गणना करना
इमेज का विश्लेषण
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 ऐप्लिकेशन इन ओरिएंटेशन पर काम नहीं करते हैं. क्या एक ऐप्लिकेशन इसका इस्तेमाल करता है या इस्तेमाल के उदाहरणों के टारगेट रोटेशन के तरीके में बदलाव नहीं करता अपडेट किया गया.
नीचे दो टेबल दी गई हैं. इनमें बताया गया है कि इस्तेमाल के उदाहरणों के टारगेट रोटेशन को सिंक में कैसे रखा जाएगा को चालू या बंद कर सकते हैं. पहले पेज पर, चार ओरिएंटेशन; दूसरा सिर्फ़ उन ओरिएंटेशन को हैंडल करता है जिनमें डिवाइस घुमाता है डिफ़ॉल्ट रूप से.
यह चुनने के लिए कि आपको अपने ऐप्लिकेशन में किन दिशा-निर्देशों का पालन करना है:
यह पुष्टि करें कि आपके ऐप्लिकेशन के कैमरे
Activity
का ओरिएंटेशन लॉक है या नहीं, अनलॉक किया गया ओरिएंटेशन या अगर यह ओरिएंटेशन के कॉन्फ़िगरेशन में किए गए बदलावों को बदलता है.यह तय करें कि आपके ऐप्लिकेशन के कैमरे
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) } }