फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए, स्क्रीन रोटेशन के व्यवहार को डिवाइस की फ़िज़िकल स्थिति के हिसाब से बदलकर, उपयोगकर्ता अनुभव को ऑप्टिमाइज़ किया जा सकता है. उदाहरण के लिए, डिवाइस को टैबलेट की तरह खोलने पर, स्क्रीन के अपने-आप घूमने की सुविधा चालू की जा सकती है. हालांकि, डिवाइस को फ़ोल्ड करने पर, स्क्रीन को पोर्ट्रेट मोड पर लॉक किया जा सकता है.
Android 13 से, Android में डिवाइस की स्थितियों के आधार पर, स्क्रीन अपने-आप घूमने की सेटिंग को पसंद के मुताबिक बनाने की सुविधा है. जैसे, फ़ोल्ड किया गया, अनफ़ोल्ड किया गया या आधा फ़ोल्ड किया गया (टेबलटॉप मोड).
पहली इमेज: डिवाइस की स्थिति के आधार पर अपने-आप घूमने की सेटिंग, जैसा कि उपयोगकर्ता को दिखती है.
डिवाइस की स्थिति के आधार पर, स्क्रीन के अपने-आप घूमने की सेटिंग चालू करना
डिवाइस की स्थिति के आधार पर स्क्रीन के अपने-आप घूमने की सुविधा चालू करने और उसे कॉन्फ़िगर करने के लिए, फ़्रेमवर्क की config.xml फ़ाइल के लिए डिवाइस ओवरले बनाएं. इसके लिए, यह तरीका अपनाएं:
अपने डिवाइस के ओवरले
config.xmlमें,config_perDeviceStateRotationLockDefaultsपूर्णांक ऐरे को पॉप्युलेट करके, डिवाइस के अलग-अलग ओरिएंटेशन के लिए, डिफ़ॉल्ट ऑटो-रोटेट के व्यवहार को कॉन्फ़िगर करें:<!-- In your device overlay, for example, device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml --> <resources> <!-- Map of device posture to rotation lock setting. Each entry must be in the format "key:value", or "key:value:fallback_key" for example: "0:1" or "2:0:1". The keys are one of Settings.Secure.DeviceStateRotationLockKey, and the values are one of Settings.Secure.DeviceStateRotationLockSetting. --> <integer-array name="config_perDeviceStateRotationLockDefaults"> <item>0:1</item> <!-- CLOSED -> LOCKED --> <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to device posture OPENED --> <item>2:2</item> <!-- OPENED -> UNLOCKED --> <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to device posture CLOSED --> </integer-array> </resources>fallback-key, डिवाइस के किसी दूसरे पोस्चर का रेफ़रंस है. आपको यह बताना होगा कि किसी पोस्चर की वैल्यूSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNOREDकब होती है. जब किसी पोस्चर को इस तरह कॉन्फ़िगर किया जाता है, तो उसके अपने-आप घूमने की सेटिंग को पाने या सेट करने के सभी अनुरोध, फ़ॉलबैक पोस्चर पर रीडायरेक्ट कर दिए जाते हैं.उदाहरण के लिए, अगर
HALF_OPENEDमुद्रा सेOPENEDमुद्रा पर वापस आ जाता है, तो:HALF_OPENEDके लिए ऑटो-रोटेट की सेटिंग पढ़ने पर,OPENEDके लिए मौजूदा सेटिंग मिलती है.- डिवाइस के
HALF_OPENEDहोने पर, अपने-आप स्क्रीन रोटेट होने की नई सेटिंग लिखने से,OPENEDकी सेटिंग अपडेट हो जाती है.
उपयोगकर्ता के हिसाब से सेट किए जा सकने वाले डिवाइस के हर मोड के लिए, ब्यौरे कॉन्फ़िगर करें. अपने डिवाइस के सेटिंग ऐप्लिकेशन के ओवरले में मौजूद
config_settableAutoRotationDeviceStatesDescriptionsस्ट्रिंग ऐरे में वैल्यू डालें:<!-- In your device's Settings app overlay --> <resources> <!-- The settings/preference description for each settable device posture defined in the array "config_perDeviceStateRotationLockDefaults". The item in position "i" describes the auto-rotation setting for the device posture also in position "i" in the array "config_perDeviceStateRotationLockDefaults". --> <string-array name="config_settableAutoRotationDeviceStatesDescriptions"> <item>Auto-rotate when folded</item> <item>@null</item> <!-- No description for state in position 1 (it is not settable by the user) --> <item>Auto-rotate when unfolded</item> </string-array> </resources>इन सेटिंग में प्रोग्राम के हिसाब से बदलाव करने के लिए, आपको सही एपीआई का इस्तेमाल करना होगा. इसके लिए, सेटिंग उपलब्ध कराने वाली कंपनियों को सीधे तौर पर नहीं लिखना होगा. ऐसा इसलिए, ताकि आपको एक जैसा अनुभव मिल सके:
रोटेशन लॉक की मौजूदा स्थिति बदलने के लिए (
ACCELEROMETER_ROTATIONमें बदलाव करता है):- SystemUI या लॉन्चर से,
RotationPolicy#setRotationLock(...)का इस्तेमाल करें. - विंडो मैनेजर में जाकर,
DisplayRotation#freezeRotation()याthawRotation()का इस्तेमाल करें.
- SystemUI या लॉन्चर से,
किसी डिवाइस की स्थिति के लिए, स्क्रीन रोटेशन लॉक करने की सेटिंग बदलने के लिए (
DEVICE_STATE_ROTATION_LOCKमें बदलाव करता है):requestDeviceStateAutoRotateSettingChange(...)एट्रिब्यूट के लिए,RotationPolicyयाDeviceStateAutoRotateSettingManagerमें से किसी एक का इस्तेमाल करें.
लागू करने से जुड़ी जानकारी
यहां दिए गए सेक्शन में, फ़ोल्ड किए जा सकने वाले डिवाइस के लिए, अपने-आप स्क्रीन रोटेट होने की सुविधा को कंट्रोल करने वाली सेटिंग और मुख्य क्लास के बारे में बताया गया है.
सेटिंग
सिस्टम, स्क्रीन के अपने-आप दिशा बदलने (ऑटो-रोटेट) की सुविधा को मैनेज करने के लिए, इन दो सेटिंग का इस्तेमाल करता है:
Settings.System.ACCELEROMETER_ROTATION: यह स्क्रीन के अपने-आप दिशा बदलने (ऑटो-रोटेट) की मुख्य सेटिंग है. फ़ोल्ड किए जा सकने वाले डिवाइस के लिए, इसकी वैल्यू से पता चलता है कि डिवाइस की मौजूदा स्थिति के लिए, ऑटो-रोटेट की सुविधा चालू है या नहीं.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: यह सेटिंग, उपयोगकर्ता की ऑटो-रोटेट की प्राथमिकता को सेव करती है. यह प्राथमिकता, डिवाइस की हर स्थिति के लिए होती है. उदाहरण के लिए, फ़ोल्ड या अनफ़ोल्ड. इससे डिवाइस की स्थिति बदलने पर, सिस्टम सही सेटिंग लागू कर पाता है.यह सेटिंग, कोलन से अलग की गई स्ट्रिंग के तौर पर सेव की जाती है. वैल्यू का हर जोड़ा, डिवाइस की पोज़िशन और उससे जुड़ी रोटेशन सेटिंग दिखाता है. इसका फ़ॉर्मैट यह है:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...रोटेशन के लिए ये वैल्यू इस्तेमाल की जाती हैं:
0: अनदेखा किया गया (फ़ॉलबैक पोस्चर के लिए सेटिंग का इस्तेमाल किया जाता है)1: लॉक है (ऑटो-रोटेट की सुविधा बंद है)2: अनलॉक है (ऑटो-रोटेट की सुविधा चालू है)
उदाहरण के लिए, स्ट्रिंग
"0:2:2:1"का मतलब है:- फ़ोल्ड किए गए डिवाइस (पोस्चर
0) के लिए, ऑटो-रोटेट की सुविधा अनलॉक होती है (2). - डिवाइस अनफ़ोल्ड होने पर (पोस्चर
2), ऑटो-रोटेट की सुविधा लॉक होती है (1).
मुख्य क्लास
डिवाइस की स्थिति के आधार पर, ऑटो-रोटेट की सेटिंग को मैनेज करने का लॉजिक, इन क्लास से मैनेज किया जाता है:
DeviceStateAutoRotateSettingManagerImpl: यहDEVICE_STATE_ROTATION_LOCKसेटिंग को मैनेज करता है. यह सेटिंग को अपडेट करने, उसकी वैल्यू वापस पाने, और बदलावों के लिए लिसनर रजिस्टर करने के तरीके उपलब्ध कराता है.DeviceStateAutoRotateSettingController(विंडो मैनेजर):ACCELEROMETER_ROTATIONऔरDEVICE_STATE_ROTATION_LOCKको सिंक करता है. डिवाइस की स्थिति बदलने पर, यहACCELEROMETER_ROTATIONको अपडेट करता है. यह अपडेट, नई स्थिति के लिए उपयोगकर्ता की प्राथमिकता के आधार पर होता है. इससे यह पक्का होता है कि मौजूदा डिवाइस के पोस्चर के लिए,ACCELEROMETER_ROTATIONमें किए गए किसी भी बदलाव कोDEVICE_STATE_ROTATION_LOCKमें वापस सेव कर दिया गया है. इसी तरह, मौजूदा पोस्चर के लिएDEVICE_STATE_ROTATION_LOCKमें किए गए बदलाव,ACCELEROMETER_ROTATIONमें दिखते हैं.DeviceStateAutoRotateSettingController(सेटिंग ऐप्लिकेशन): डिवाइस की स्थिति के आधार पर, स्क्रीन के अपने-आप दिशा बदलने की सेटिंग वाले पेज पर यूज़र इंटरफ़ेस (यूआई) को कंट्रोल करें.PostureDeviceStateConverter: यह फ़ंक्शन, डिवाइस की सामान्य स्थिति के आइडेंटिफ़ायर और इस सुविधा के लिए इस्तेमाल किए जाने वाले डिवाइस की स्थिति के आइडेंटिफ़ायर के बीच कन्वर्ज़न करता है.
Validation
इस सुविधा का काम करने का तरीका, ओईएम के कॉन्फ़िगरेशन पर काफ़ी हद तक निर्भर करता है. इसलिए, इसके लिए कोई खास सीटीएस टेस्ट नहीं हैं. आपको मैन्युअल तरीके से जांच करनी होगी. इससे यह पुष्टि की जा सकेगी कि डिवाइस को कॉन्फ़िगर की गई अलग-अलग फ़िज़िकल स्थितियों के बीच ट्रांज़िशन करने पर, स्क्रीन अपने-आप घूमने की सेटिंग में उम्मीद के मुताबिक बदलाव होता है.