Android จะเปิดใช้งานโหมดความเข้ากันได้สำหรับแอปที่ประกาศข้อจำกัดด้านการวางแนวหรือการปรับขนาด โหมดความเข้ากันได้ช่วยให้แอปทำงานได้อย่างยอมรับได้ในอุปกรณ์หน้าจอขนาดใหญ่ โทรศัพท์จอพับ และสภาพแวดล้อมเดสก์ท็อป แต่ความสามารถในการใช้งานอาจไม่เหมาะสมที่สุด
การลบล้างต่อแอปช่วยให้ผู้ผลิตอุปกรณ์ เจ้าของอุปกรณ์เสมือนจริง1 และผู้ใช้เปลี่ยนลักษณะการทำงานของแอปเพื่อปรับปรุงเลย์เอาต์ของแอปหรือป้องกันไม่ให้แอปขัดข้องในอุปกรณ์บางรุ่นได้
Android 16
Android 16 (ระดับ API 36) จะไม่สนใจข้อจำกัดด้านการวางแนวหน้าจอ สัดส่วนภาพ และความสามารถในการปรับขนาดแอปเพื่อปรับปรุงเลย์เอาต์ของแอปในรูปแบบของอุปกรณ์ที่มีความกว้างที่เล็กที่สุด >= 600dp
การลบล้างต่อแอปต่อไปนี้จะใช้งานไม่ได้สำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 36
- FORCE_RESIZE_APP
- FORCE_NON_RESIZE_APP
- OVERRIDE_MIN_ASPECT_RATIO
- OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
- OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
- OVERRIDE_MIN_ASPECT_RATIO_LARGE
- OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
- OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
- OVERRIDE_ANY_ORIENTATION
- OVERRIDE_ANY_ORIENTATION_TO_USER
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
- OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
- OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
- OVERRIDE_RESPECT_REQUESTED_ORIENTATION
เลือกไม่รับ
แอปของคุณสามารถกำหนดเป้าหมายเป็น API ระดับ 36 แต่เลือกไม่ใช้ลักษณะการทำงานของ Android 16 ได้ ซึ่งในกรณีนี้ OVERRIDE_ANY_ORIENTATION_TO_USER จะไม่เกี่ยวข้อง
ประกาศพร็อพเพอร์ตี้ไฟล์ Manifest
หากต้องการเลือกไม่ใช้ลักษณะการทำงานของระดับ API 36 ให้ประกาศพร็อพเพอร์ตี้ไฟล์ Manifest PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
หากต้องการเลือกไม่ใช้สำหรับกิจกรรมที่เฉพาะเจาะจง ให้ตั้งค่าพร็อพเพอร์ตี้ในองค์ประกอบ <activity> ดังนี้
<activity ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</activity>
หากต้องการเลือกไม่ใช้สำหรับทั้งแอป ให้ตั้งค่าพร็อพเพอร์ตี้ในองค์ประกอบ <application> ดังนี้
<application ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</application>
หากแอปกำหนดเป้าหมายเป็น Android 16 (ระดับ API 36) ขึ้นไป พร็อพเพอร์ตีนี้จะไม่ล็อกการวางแนวการแสดงผลหรือป้องกันการหมุนหน้าจอบนจอแสดงผลขนาดใหญ่
อุปกรณ์อ้างอิง
อุปกรณ์ต่อไปนี้อาจต้องมีการลบล้างต่อแอปเนื่องจากมีการกำหนดค่าที่ผิดปกติหรือการกำหนดค่าที่แอปไม่รองรับอย่างเหมาะสม
- แท็บเล็ต: การวางแนวตามปกติของแท็บเล็ตบางรุ่น เช่น Pixel Tablet คือแนวนอน อุปกรณ์จะอยู่ในแนวตามปกติเมื่อ
Display#getRotation()แสดงผลเป็นSurface.ROTATION_0หากแอปถือว่าROTATION_0เป็นแนวตั้ง เลย์เอาต์ของแอปและตัวอย่างภาพจากกล้องอาจไม่ตรงกับการแสดงผลของอุปกรณ์ - อุปกรณ์แบบพับได้ในแนวนอน: อุปกรณ์แบบพับได้บางรุ่น เช่น Pixel Fold จะอยู่ในแนวตั้งเมื่อพับ แต่จะอยู่ในแนวนอนเมื่อกางออก หากแอปถือว่าการวางแนวแบบกางออกเป็นแนวตั้ง ก็อาจเกิดการวนซ้ำของการกะพริบหรือปัญหาเกี่ยวกับเลย์เอาต์
- โทรศัพท์จอพับ: โทรศัพท์จอพับที่กางออกมักจะอยู่ในแนวตั้ง แต่เมื่อพับแล้ว โทรศัพท์มักจะมีจอแสดงผลขนาดเล็กในแนวนอน แอปต้องระบุและรองรับการวางแนวการแสดงผลที่แตกต่างกัน
- จอแสดงผลภายนอก: อุปกรณ์บางรุ่นสามารถเริ่มเซสชันหน้าต่างเดสก์ท็อปบนจอแสดงผลภายนอกที่เชื่อมต่ออยู่ได้ แอปต้องค้นหาข้อมูลจากจอแสดงผลภายนอก เช่น ขนาดหน้าจอและความละเอียด มิฉะนั้น แอปอาจตั้งสมมติฐานที่ไม่ถูกต้องเกี่ยวกับจอแสดงผล ซึ่งอาจทำให้แอปทำงานไม่ถูกต้อง
- จอแสดงผลในรถยนต์: จอแสดงผลในรถยนต์จำนวนมากเป็นแนวนอน แต่ไม่ใช่ทั้งหมด การพัฒนาแอปที่ใช้ขณะจอดสำหรับจอแสดงผลในรถยนต์คล้ายกับการพัฒนาสำหรับแท็บเล็ต
ปัญหาความเข้ากันได้ที่พบบ่อย
แอปมักประสบปัญหาความเข้ากันได้เนื่องจากข้อจำกัดด้านการวางแนวของแอป ข้อจำกัดด้านความสามารถในการปรับขนาดและสัดส่วนภาพ การจัดการการวางแนวตัวอย่างกล้องที่ไม่ถูกต้อง และ API ที่ใช้ในทางที่ผิด
เล็ทเทอร์บ็อกซิง
Letterbox จะจัดตำแหน่งแอปให้อยู่ตรงกลางหน้าจอ หรือจัดตำแหน่งไว้ด้านใดด้านหนึ่งบนหน้าจอขนาดใหญ่เพื่อให้เข้าถึงได้สะดวก แถบสีทึบหรือวอลเปเปอร์เบลอจะเติมพื้นที่แสดงผลที่ไม่ได้ใช้ตามด้านข้างหรือด้านบนและด้านล่างของแอป
การแสดงผลแบบ Letterbox มักเกิดขึ้นในอุปกรณ์หน้าจอขนาดใหญ่เนื่องจากขนาดและสัดส่วนภาพของจอแสดงผลของอุปกรณ์มักแตกต่างจากโทรศัพท์มาตรฐานซึ่งเป็นอุปกรณ์ที่แอปส่วนใหญ่ออกแบบมาให้รองรับ
รูปที่ 1 แอปที่จำกัดให้แสดงในแนวตั้งจะแสดงแบบ Letterbox บนแท็บเล็ตและอุปกรณ์แบบพับได้ในแนวนอน
ปัญหา
แอปไม่รองรับการกำหนดค่าการแสดงผลทั้งหมดเนื่องจากแอปมีการวางแนวคงที่ สัดส่วนภาพคงที่ หรือปรับขนาดไม่ได้
การตั้งค่าการกำหนดค่าที่ควบคุมการวางแนวและความสามารถในการปรับขนาดของแอปมีดังนี้
screenOrientation: ระบุการวางแนวคงที่สำหรับแอป แอปยังตั้งค่าการวางแนวที่รันไทม์ได้โดยใช้Activity#setRequestedOrientation()resizeableActivity: ระบุว่าระบบสามารถปรับขนาดแอปให้พอดีกับหน้าต่างที่มีขนาดต่างๆ ได้หรือไม่ ใน Android 11 (API ระดับ 30) และต่ำกว่า ให้ระบุว่าแอปรองรับโหมดหลายหน้าต่างหรือไม่ ใน Android 12 (ระดับ API 31) ขึ้นไป ให้ระบุว่าแอปรองรับโหมดหลายหน้าต่างในหน้าจอขนาดเล็ก (คลาสขนาดหน้าต่างแบบกะทัดรัด) หรือไม่ ใน Android 12 ขึ้นไป แอปจะรองรับโหมดหลายหน้าต่างในหน้าจอขนาดใหญ่ (คลาสขนาดหน้าต่างปานกลางหรือขยาย) ไม่ว่าการตั้งค่านี้จะเป็นอย่างไรmaxAspectRatio: ระบุสัดส่วนภาพสูงสุดที่แอปรองรับ เฉพาะแอปที่มีresizeableActivityตั้งค่าเป็นfalseเท่านั้นที่ตั้งค่าmaxAspectRatioได้minAspectRatio: ระบุสัดส่วนภาพขั้นต่ำที่แอปรองรับ เฉพาะแอปที่ตั้งค่าresizeableActivityเป็นfalseเท่านั้นที่ตั้งค่าminAspectRatioได้
แอปที่จำกัดให้แสดงในแนวตั้งจะใช้งานในอุปกรณ์ที่แสดงในแนวนอนไม่ได้
การเพิ่มประสิทธิภาพ
แอปควรรองรับการแสดงผลในทุกการวางแนวและขนาดของอุปกรณ์ รวมถึงโหมดหลายหน้าต่าง นําข้อจํากัดด้านการวางแนวและสัดส่วนภาพคงที่ทั้งหมดออกจากเลย์เอาต์แอปและไฟล์ Manifest ของแอป
แอปรองรับการวางแนวอุปกรณ์ทั้งหมด
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
หากแอปที่มีการวางแนวคงที่หรือสัดส่วนภาพคงที่ทำงานในหน้าต่างที่แอปไม่รองรับขนาดหรือการวางแนวของหน้าต่างโดยตรง Android จะแสดงแอปแบบ Letterbox เพื่อรักษาความต่อเนื่อง
ตั้งแต่ Android 12 (API ระดับ 31) และ 12L (API ระดับ 32) เป็นต้นไป แพลตฟอร์มจะใช้การปรับปรุงที่หลากหลายกับแอปที่มีแถบดำด้านบนและด้านล่าง ผู้ผลิตอุปกรณ์จะใช้การเพิ่มประสิทธิภาพ UI คุณไม่จำเป็นต้องพัฒนาแอปเพิ่มเติมเพื่อรับประโยชน์จากการปรับปรุงนี้
Android 12 (ระดับ API 31) มีการปรับปรุงด้านความสวยงามต่อไปนี้ ซึ่งผู้ผลิตอุปกรณ์สามารถกำหนดค่าได้
- มุมโค้งมน: มุมของหน้าต่างแอปมีรูปลักษณ์ที่ละเอียดยิ่งขึ้น
- ความโปร่งใสของแถบระบบ: แถบสถานะและแถบนำทางซึ่งวางซ้อนแอปจะกึ่งโปร่งใส ทำให้ไอคอนบนแถบมองเห็นได้เสมอเหนือพื้นหลังแบบ Letterbox
- สัดส่วนภาพที่กำหนดค่าได้: คุณสามารถปรับสัดส่วนภาพของแอปเพื่อปรับปรุงลักษณะที่ปรากฏของแอปได้
รูปที่ 2 แอปแบบ Letterbox ที่มีการปรับปรุง UI
12L (ระดับ API 32) เพิ่มการปรับปรุงฟังก์ชันการทำงานต่อไปนี้
การจัดตำแหน่งที่กำหนดค่าได้: ในหน้าจอขนาดใหญ่ ผู้ผลิตอุปกรณ์สามารถจัดตำแหน่งแอปไว้ทางด้านซ้ายหรือขวาของจอแสดงผลได้ ซึ่งจะช่วยให้โต้ตอบได้ง่ายขึ้น
ปุ่มรีสตาร์ทที่ออกแบบใหม่: ผู้ผลิตอุปกรณ์สามารถปรับโฉมปุ่มรีสตาร์ทสำหรับโหมดความเข้ากันได้ของขนาดเพื่อให้ผู้ใช้จดจำได้ง่ายขึ้น
Android 13 (API ระดับ 33) เพิ่มกล่องโต้ตอบการให้ความรู้แก่ผู้ใช้เกี่ยวกับการจัดตำแหน่งแอป Letterbox บนหน้าจอหรือการรวม Letterbox ไว้ในโหมดแยกหน้าจอ
รูปที่ 3 แอปที่มีแถบสีดำด้านบนและด้านล่างพร้อมกล่องโต้ตอบให้ความรู้แก่ผู้ใช้
โหมดความเข้ากันได้ของขนาด
โหมดความเข้ากันได้ของขนาดคือการแสดงผลแบบ Letterbox ที่คงสัดส่วนภาพของแอปไว้และมีการควบคุมการรีสตาร์ท การควบคุมนี้ช่วยให้ผู้ใช้รีสตาร์ทแอปและวาดการแสดงผลใหม่ได้ Android จะเรียกใช้โหมดความเข้ากันได้ของขนาดสำหรับแอปที่ปรับขนาดไม่ได้ เมื่อกิจกรรมย้ายไปยังคอนเทนเนอร์การแสดงผลที่เข้ากันไม่ได้กับขนาดของกิจกรรม ระบบอาจปรับขนาดแอปใหม่เพื่อเติมการแสดงผลของอุปกรณ์ในมิติข้อมูลอย่างน้อย 1 รายการ
การเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ที่สามารถทริกเกอร์โหมดความเข้ากันได้ของขนาดมีดังนี้
- การหมุนอุปกรณ์
- อุปกรณ์แบบพับได้กำลังพับหรือกางออก
- สลับระหว่างโหมดการแสดงผลแบบเต็มหน้าจอและแบบแยกหน้าจอ
ปัญหา
โดยทั่วไปแล้ว โหมดความเข้ากันได้ของขนาดจะใช้กับกิจกรรมที่ถูกจำกัดการวางแนวหรือสัดส่วนภาพ และได้รับการกำหนดค่า (หรือกำหนดโดยระบบ) ให้ปรับขนาดไม่ได้
ระบบจะถือว่าแอปของคุณปรับขนาดได้ และจะไม่วางแอปไว้ในโหมดความเข้ากันได้ของขนาด หากแอปเป็นไปตามเกณฑ์ต่อไปนี้
- ปรับขนาดได้ด้วย
resizeableActivity="true" - รองรับโหมดการแสดงภาพซ้อนภาพ (PIP)
- ฝังไว้
- มีการลบล้าง
FORCE_RESIZE_APPต่อแอปที่ผู้ผลิตอุปกรณ์ใช้ (ระบบจะไม่สนใจพร็อพเพอร์ตี้ที่แอปตั้งค่าไว้)
หากแอปไม่เป็นไปตามเงื่อนไขใดๆ ระบบจะถือว่าแอปปรับขนาดไม่ได้และอาจอยู่ในโหมดความเข้ากันได้ของขนาด
แอปที่ปรับขนาดไม่ได้ขัดข้องในโหมดหลายหน้าต่าง
การเพิ่มประสิทธิภาพ
แอปควรรองรับขนาดการแสดงผลทั้งหมด ทำให้แอปปรับขนาดได้โดยตั้งค่าแอตทริบิวต์ android:resizeableActivity ขององค์ประกอบ <activity> หรือ <application> เป็น true ในไฟล์ Manifest ของแอป ออกแบบเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์/ปรับเปลี่ยนได้สำหรับแอปของคุณ ดูข้อมูลเพิ่มเติมได้ที่รองรับขนาดการแสดงผลต่างๆ และรองรับโหมดหลายหน้าต่าง
แอปทำงานได้ในหน้าต่างทุกขนาด
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
Android จะวางแอปไว้ในโหมดความเข้ากันได้ของขนาดเมื่อระบบพิจารณาว่าการแสดงผลของแอปที่แสดงแบบ Letterbox สามารถปรับปรุงได้โดยการปรับขนาดแอปใหม่เพื่อเติมหน้าต่างการแสดงผลในมิติข้อมูลอย่างน้อย 1 รายการ ระบบจะแสดงตัวควบคุมการรีสตาร์ทซึ่งจะสร้างกระบวนการของแอปขึ้นมาใหม่ โดยสร้างกิจกรรมขึ้นมาใหม่และวาดการแสดงผลใหม่ โปรดดูภาพรวมของกระบวนการและชุดข้อความด้วย
แอปที่แสดงเฉพาะแนวตั้งจะแสดงแบบ Letterbox ในแนวนอน และปรับขนาดใหม่โดยตัวควบคุมการรีสตาร์ท
โหมดความเข้ากันได้ของจอแสดงผล
โหมดความเข้ากันได้ของการแสดงผลจะป้องกันไม่ให้แอปรีสตาร์ทเมื่อแอปย้ายไปมาระหว่างจอแสดงผลต่างๆ ซึ่งอาจทริกเกอร์การเปลี่ยนแปลงการกำหนดค่า เช่น การเปลี่ยนแปลงโหมดสี ความพร้อมใช้งานของหน้าจอสัมผัส หรือความหนาแน่นของหน้าจอ
ระบบจะเปิดใช้โหมดความเข้ากันได้ของการแสดงผลโดยค่าเริ่มต้นสำหรับเกม (อิงตามแฟล็ก android:appCategory) เพื่อปรับปรุงความเสถียรและความต่อเนื่อง
โหมดความเข้ากันได้ของการแสดงผลจะไม่หยุดการกำหนดค่าของแอปไว้ชั่วคราว ซึ่งต่างจากโหมดความเข้ากันได้ของขนาด แอปจะยังคงได้รับการอัปเดตการกำหนดค่าทั้งหมดผ่าน API เช่น Callback onConfigurationChanged() แต่จะไม่มีการรีสตาร์ทที่รบกวนการทำงาน ซึ่งหมายความว่าเกมที่รองรับ API อย่างเหมาะสม เช่น onConfigurationChanged() จะยังคงอัปเดต UI ได้อย่างตอบสนองแม้ว่าจะอยู่ในโหมดความเข้ากันได้ของการแสดงผลก็ตาม
หากต้องการเลือกไม่ใช้โหมดความเข้ากันได้ของการแสดงผลและจัดการการเปลี่ยนแปลงการกำหนดค่าในแอป ให้ประกาศการรองรับการเปลี่ยนแปลงการกำหนดค่าในไฟล์ AndroidManifest.xml ของแอป และจัดการการเปลี่ยนแปลงการกำหนดค่าใน Callback onConfigurationChanged()
<activity
android:name=".MyGameActivity"
android:configChanges="colorMode|touchscreen|density|...">
...
</activity>
ลูปแบบกะพริบ
เมื่อแอปไม่รองรับการวางแนวการแสดงผลทั้งหมด แอปอาจขอการวางแนวใหม่ซ้ำๆ เมื่อมีการเปลี่ยนแปลงการกำหนดค่า ซึ่งจะสร้างลูปที่ไม่มีที่สิ้นสุดซึ่งทำให้จอแสดงผลกะพริบหรือแอปหมุนไม่สิ้นสุด
ปัญหา
ใน Android 12 (ระดับ API 31) ขึ้นไป ผู้ผลิตอุปกรณ์สามารถกำหนดค่าอุปกรณ์ให้ละเว้นข้อจำกัดด้านการวางแนวที่แอปกำหนด และบังคับใช้โหมดความเข้ากันได้แทน ตัวอย่างเช่น อุปกรณ์แบบพับได้อาจละเว้นการตั้งค่า android:screenOrientation="portrait" ของกิจกรรมเมื่อกิจกรรมแสดงบนหน้าจอภายในขนาดแท็บเล็ตแนวนอนของอุปกรณ์
หากระบบละเว้นข้อจำกัดการวางแนวของแอป แอปจะตั้งค่าการวางแนวแบบเป็นโปรแกรมได้โดยเรียกใช้ Activity#setRequestedOrientation() การเรียกใช้จะทริกเกอร์การรีสตาร์ทแอปหากแอปไม่ได้จัดการการเปลี่ยนแปลงการกำหนดค่า (ดูจัดการการเปลี่ยนแปลงการกำหนดค่า) หลังจากรีสตาร์ท ระบบจะละเว้นข้อจำกัดการวางแนวของแอปอีกครั้ง แอปจะเรียกใช้ setRequestedOrientation() ซ้ำ การเรียกใช้จะทริกเกอร์การรีสตาร์ทแอป และวนซ้ำไปเรื่อยๆ
อีกวิธีหนึ่งที่คุณอาจพบปัญหานี้คือเมื่อการวางแนวตามธรรมชาติ (การวางแนวปกติตามที่ Android กำหนด) ของหน้าจออุปกรณ์เป็นแนวนอน (นั่นคือ การเรียกใช้ Display#getRotation() จะแสดงผลเป็น Surface.ROTATION_0 ขณะที่อุปกรณ์มีสัดส่วนภาพแนวนอน) ที่ผ่านมา แอปต่างๆ จะถือว่า Display.getRotation() =
Surface.ROTATION_0 หมายความว่าอุปกรณ์อยู่ในแนวตั้ง แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป เช่น บนหน้าจอด้านในของอุปกรณ์แบบพับได้บางรุ่นและแท็บเล็ตบางรุ่น
แอปในแนวนอนบนจอแสดงผลด้านในแบบพับได้อาจตรวจสอบการหมุนหน้าจอ รับค่า ROTATION_0 โดยถือว่าการวางแนวตามปกติของอุปกรณ์คือแนวตั้ง และเรียกใช้ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
) เพื่อกำหนดค่าเลย์เอาต์ของแอปใหม่ หลังจากแอปรีสตาร์ท (ในแนวการวางแบบแนวนอน) แอปอาจตรวจสอบการหมุนหน้าจออีกครั้ง รับค่าเป็น ROTATION_0 เรียกใช้ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) และวนซ้ำไปเรื่อยๆ
แอปที่แสดงผลในแนวนอนเท่านั้นบนจอแสดงผลแนวตั้งจะเรียกใช้ Activity#setRequestedOrientation() ซ้ำๆ
การเพิ่มประสิทธิภาพ
แอปไม่ควรดำเนินการต่อไปนี้
- ตั้งค่าการวางแนวเริ่มต้นด้วย
Activity#setRequestedOrientation()ในเมธอดonCreate()ของกิจกรรม เนื่องจากคำขอการวางแนวอาจถูกเรียกใช้โดยไม่คาดคิดจากการเปลี่ยนแปลงการกำหนดค่าที่ไม่ได้จัดการ - สมมติว่าการวางแนวตามปกติของอุปกรณ์ (
ROTATION_0) เป็นแนวตั้ง - ตั้งค่าการวางแนวตามสัญญาณที่ไม่เกี่ยวข้องกับขนาดหน้าต่างปัจจุบัน เช่น
Display#getRotation(), การมีFoldingFeatureหรือ API ที่เลิกใช้งานแล้ว
แอปจัดการการเปลี่ยนแปลงการกำหนดค่า ไม่มีการจำกัดการวางแนว จึงไม่เข้าสู่ลูปการกะพริบ
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
Android จะไม่สนใจการเรียกใช้ Activity#setRequestedOrientation() ในสถานการณ์ต่อไปนี้
กิจกรรมได้เปิดอีกครั้งจากการเรียกใช้เมธอดก่อนหน้า หรือเปิดใช้การบังคับหมุนเพื่อความเข้ากันได้ของกล้องแล้ว (ดูตัวอย่างกล้องด้านล่าง)
ผู้ผลิตอุปกรณ์สามารถใช้ลักษณะการทำงานนี้กับแอปที่มี
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATIONได้กิจกรรมส่งคำขอการวางแนวมากกว่า 2 รายการใน 1 วินาที ซึ่งบ่งชี้ว่าเกิดลูปขึ้น จากคำขอ 2 รายการในลูป Android จะใช้คำขอที่เพิ่มพื้นที่การแสดงผลของแอปให้สูงสุด
ผู้ผลิตอุปกรณ์สามารถใช้ลักษณะการทำงานนี้กับแอปที่มี
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTEDได้เจ้าของอุปกรณ์เสมือนจริงได้ลบล้างการเรียกใช้เมธอดในอุปกรณ์บางเครื่อง
ตัวอย่างจากกล้อง
ตัวอย่างภาพจากกล้อง (หรือช่องมองภาพ) ของแอปกล้องอาจไม่ตรงแนวหรือบิดเบี้ยวในแท็บเล็ต แล็ปท็อป และจอแสดงผลแบบพับได้
ดูข้อมูลเพิ่มเติมได้ที่ตัวอย่างจากกล้องในหน้าต่างเดสก์ท็อป
ปัญหา
เอกสารนิยามความเข้ากันได้ของ Android ระบุว่าเซ็นเซอร์รูปภาพของกล้อง "ต้องวางแนวให้ด้านยาวของกล้องอยู่ในแนวเดียวกับด้านยาวของหน้าจอ"
แอปมักจะถือว่าการวางแนวอุปกรณ์และการวางแนวเซ็นเซอร์กล้องเป็นแนวตั้ง ซึ่งเป็นสมมติฐานที่สมเหตุสมผลสำหรับโทรศัพท์มือถือมาตรฐาน แต่การวางแนวตามธรรมชาติของแท็บเล็ตและแล็ปท็อป รวมถึงเซ็นเซอร์ตรวจจับผ่านกล้องอาจเป็นแนวนอน นอกจากนี้ รูปแบบของอุปกรณ์ใหม่ๆ เช่น อุปกรณ์พับได้ อาจมีการวางแนวตามธรรมชาติหลายแบบและเซ็นเซอร์กล้องหลายตัวในการวางแนวที่แตกต่างกัน
การเริ่มกิจกรรมด้วยการวางแนวกล้องที่แอปไม่ได้คาดไว้หรือการสลับไปมาระหว่างกล้องหรือหน้าจออุปกรณ์ต่างๆ (สำหรับอุปกรณ์แบบพับได้) อาจทำให้ตัวอย่างภาพจากกล้องไม่ตรงแนวหรือบิดเบี้ยว
ตัวอย่างภาพจากกล้องไม่ตรงแนวและบิดเบี้ยวในอุปกรณ์แบบพับได้ที่มีหน้าจอขนาดใหญ่
การเพิ่มประสิทธิภาพ
แอปกล้องต้องระบุและจัดการการวางแนวของอุปกรณ์และการวางแนวเซ็นเซอร์กล้องอย่างถูกต้องเพื่อแสดงตัวอย่างภาพจากกล้องที่จัดแนวและปรับขนาดอย่างถูกต้อง แอปต้องคำนวณการหมุนของอุปกรณ์ การหมุนของเซ็นเซอร์ และสัดส่วนภาพของหน้าจอหรือหน้าต่าง แล้วนำผลลัพธ์ไปใช้กับตัวอย่างภาพจากกล้อง ดูคำแนะนำโดยละเอียดได้ที่ตัวอย่างภาพจากกล้องและขอแนะนำช่องมองภาพของกล้อง
ตัวอย่างภาพจากกล้องจัดแนวและปรับขนาดอย่างถูกต้องในทุกการวางแนวของอุปกรณ์
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
อุปกรณ์จะอยู่ในแนวตามปกติเมื่อ Display#getRotation() แสดงผลเป็น Surface.ROTATION_0 ระบบจะคำนวณ CameraCharacteristics.SENSOR_ORIENTATION จากการวางแนวตามธรรมชาติของอุปกรณ์ Android จะจัดแนวหน้าต่างแนวตั้งของแอปที่จำกัดให้แสดงเฉพาะแนวตั้งให้สอดคล้องกับการวางแนวตามปกติของอุปกรณ์ ซึ่งเป็นสิ่งที่แอปส่วนใหญ่คาดหวัง นอกจากนี้ Android ยังครอบตัดรูปภาพเซ็นเซอร์กล้องเมื่อการวางแนวเซ็นเซอร์เป็นแนวนอนและตัวอย่างกล้องเป็นแนวตั้ง วิธีแก้ปัญหาเฉพาะมีดังนี้
บังคับหมุนตัวอย่างภาพจากกล้องสำหรับแอปที่จำกัดให้แสดงในแนวตั้ง: แอปที่จำกัดให้แสดงในแนวตั้งจะคาดหวังว่าการวางแนวตามปกติของอุปกรณ์และการวางแนวเซ็นเซอร์กล้องจะเป็นแนวตั้ง อย่างไรก็ตาม ใน Android 12 (ระดับ API 31) ขึ้นไป แอปจะทำงานได้ในแนวการวางอุปกรณ์หลายแนวหากผู้ผลิตอุปกรณ์ละเว้นข้อกำหนดด้านการวางแนว
เมื่อแอปที่จำกัดให้แสดงผลในแนวตั้งเชื่อมต่อกับกล้อง Android จะบังคับหมุนแอปเพื่อจัดแนวหน้าต่างแนวตั้งของแอปให้สอดคล้องกับการวางแนวตามธรรมชาติของอุปกรณ์
ในแท็บเล็ตบางรุ่น (ดูอุปกรณ์อ้างอิง) หน้าต่างแนวตั้งของแอปจะหมุนเป็นแนวตั้งแบบเต็มหน้าจอเพื่อให้สอดคล้องกับการวางแนวตามปกติของอุปกรณ์ แอปจะแสดงเต็มหน้าจอหลังจากบังคับให้หมุน
แท็บเล็ต — บังคับให้หมุนแอปที่จำกัดให้แสดงเฉพาะแนวตั้ง
ในหน้าจอด้านในแนวนอนของอุปกรณ์แบบพับได้ (ดูอุปกรณ์อ้างอิง) กิจกรรมที่แสดงเฉพาะแนวตั้งจะหมุนเป็นแนวนอนเพื่อให้สอดคล้องกับการวางแนวตามธรรมชาติเมื่อกางออก แอปจะแสดงผลแบบ Letterbox หลังจากบังคับหมุนหน้าจอ
อุปกรณ์แบบพับได้ — บังคับให้หมุนแอปที่จำกัดให้แสดงในแนวตั้งเท่านั้น โดยแอปจะแสดงแบบ Letterbox ด้วย
การครอบตัดกล้องหน้าด้านใน: เซ็นเซอร์กล้องหน้าด้านในของอุปกรณ์แบบพับได้บางรุ่นจะอยู่ในแนวนอน นอกเหนือจากการบังคับหมุนตัวอย่างภาพจากกล้องบนจอแสดงผลด้านในแบบพับได้แล้ว Android ยังครอบตัดขอบเขตการมองเห็นของกล้องหน้าด้านใน (แนวนอน) เพื่อให้เซ็นเซอร์จับภาพมุมมองตรงข้ามกับการวางแนวของอุปกรณ์
บังคับรีเฟรชตัวอย่างภาพจากกล้อง: ระบบจะวนรอบผ่านเมธอดกิจกรรม
onStop()และonStart()(โดยค่าเริ่มต้น) หรือonPause()และonResume()(ใช้โดยการลบล้าง OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE ต่อแอป) หลังจากบังคับหมุนเพื่อให้แน่ใจว่าตัวอย่างภาพจากกล้องแสดงอย่างถูกต้องการปรับขนาดสัดส่วนภาพ: ระบบจะเปลี่ยนสัดส่วนภาพของตัวอย่างกล้องที่บังคับให้หมุนเป็นสัดส่วนภาพขั้นต่ำที่สูงขึ้นแบบไดนามิก ซึ่งช่วยให้มั่นใจได้ว่าตัวอย่างกล้องจะได้รับการปรับขนาดอย่างเหมาะสม
นักพัฒนาแอปสามารถลบล้างวิธีแก้ปัญหาเหล่านี้ได้หากแอปจัดการตัวอย่างภาพจากกล้องอย่างถูกต้อง โปรดดูหัวข้อการลบล้างต่อแอป
API ที่มักมีการใช้ในทางที่ผิด
เนื่องจาก Android ได้เพิ่มการรองรับฟีเจอร์ต่างๆ เช่น โหมดหลายหน้าต่างและอุปกรณ์ต่างๆ เช่น อุปกรณ์แบบพับได้ API เดิมจึงเลิกใช้งานและแทนที่ด้วย API ที่อัปเดตซึ่งทำงานได้กับจอแสดงผลทุกขนาดและอุปกรณ์ทุกรูปแบบ อย่างไรก็ตาม API ที่เลิกใช้งานแล้วจะยังคงพร้อมใช้งานเพื่อความเข้ากันได้แบบย้อนหลัง
API ของ View บางรายการออกแบบมาเพื่อวัตถุประสงค์พิเศษที่นักพัฒนาแอปอาจไม่เข้าใจเสมอไป
ปัญหา
นักพัฒนาแอปยังคงใช้ Display API ที่เลิกใช้งานแล้ว และสันนิษฐานอย่างไม่ถูกต้องว่า API จะแสดงผลขอบเขตของแอปแทนขอบเขตพื้นที่แสดงผลของอุปกรณ์ หรือนักพัฒนาแอปใช้ API มุมมองวัตถุประสงค์พิเศษเพื่อรับเมตริกการแสดงผลทั่วไปโดยไม่ตั้งใจ
ผลลัพธ์ที่ได้คือการคำนวณผิดพลาดเมื่อเปลี่ยนตำแหน่งองค์ประกอบ UI หลังจากเหตุการณ์การปรับขนาดหน้าต่างแอป ซึ่งทำให้เกิดปัญหาเกี่ยวกับเลย์เอาต์
Display API ที่เลิกใช้งานแล้วและมักใช้ในทางที่ผิด
ดูข้อมูลเพิ่มเติมได้ที่รองรับโหมดหลายหน้าต่าง
API การดูที่ใช้ในทางที่ผิด:
API ที่เลิกใช้งานแล้วคำนวณขอบเขตของแอปผิดพลาด เนื้อหาแอปอยู่นอกหน้าจอ
การเพิ่มประสิทธิภาพ
อย่าพึ่งพาขนาดการแสดงผลจริงในการจัดตำแหน่งองค์ประกอบ UI ย้ายข้อมูลแอปไปยัง API ที่อิงตาม WindowMetrics ซึ่งรวมถึง API WindowManager ต่อไปนี้
แพลตฟอร์ม:
Jetpack:
API คำนวณเมตริกหน้าต่างแอปได้อย่างถูกต้อง
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
การลบล้าง 2 รายการจะปรับ API Display ที่เลิกใช้งานแล้วและ API View ที่ใช้ในทางที่ผิดเพื่อแสดงขอบเขตของแอป ดังนี้
ALWAYS_SANDBOX_DISPLAY_APIS สำหรับ API Display และ OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS สำหรับ API View นอกจากนี้ ระบบจะใช้ ALWAYS_SANDBOX_DISPLAY_APIS โดยค่าเริ่มต้นกับแอปที่มีสิทธิ์ใช้โหมดความเข้ากันได้ของขนาดด้วย
กิจกรรมที่โปร่งใส
กิจกรรมที่โปร่งใสเป็นผลมาจากรูปแบบพื้นหลังที่โปร่งใส เช่น
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
ธีมที่เกี่ยวข้องกับกล่องโต้ตอบ เช่น Theme.MaterialComponents.Dialog อาจมีสไตล์ที่ทำให้กิจกรรมโปร่งใส
กิจกรรมแบบโปร่งใสไม่ได้ครอบคลุมพื้นที่แสดงผลทั้งหมดที่มีอยู่ ซึ่งทำให้จัดการได้ยากเนื่องจากพื้นที่แสดงผลที่ใช้ได้อาจเปลี่ยนแปลงตามการเปลี่ยนแปลงการกำหนดค่า เช่น การหมุนอุปกรณ์ การพับและกางอุปกรณ์ และโหมดหลายหน้าต่าง
ปัญหา
กิจกรรมแบบโปร่งใสควรเป็นไปตามขอบเขตของกิจกรรมแบบทึบแสงแรกที่อยู่ใต้กิจกรรมแบบโปร่งใสในสแต็กกิจกรรมของงาน อย่างไรก็ตาม กิจกรรมทึบแสงที่เปิดกล่องโต้ตอบสิทธิ์อาจเป็นแทรมโพลีน (กิจกรรมที่เปิดกิจกรรมอื่นแล้วหายไป) ดังนั้นระบบจึงไม่สามารถระบุขอบเขตของกิจกรรมแทรมโพลีนที่เปิดกิจกรรมกล่องโต้ตอบสิทธิ์แบบโปร่งใสได้
กล่องโต้ตอบอยู่ในตำแหน่งที่ไม่ถูกต้องเนื่องจากกิจกรรมเปิดขึ้นจากแทรมโพลีน
การเพิ่มประสิทธิภาพ
กิจกรรมแบบโปร่งใสจะรับค่าข้อจำกัดจากกิจกรรมแบบทึบแสงที่อยู่ด้านบนสุดซึ่งอยู่ใต้กิจกรรมดังกล่าวในสแต็กกิจกรรมของงาน กิจกรรมทึบแสงต้องพร้อมใช้งานตลอดวงจรของกิจกรรมโปร่งใส ตั้งแต่การสร้างกิจกรรมไปจนถึงการทำลาย ด้วยเหตุนี้ อย่าเปิดคำขอสิทธิ์จากกิจกรรมแทรมโพลีน
หากกิจกรรมแทรมโพลีนเปิดคำขอสิทธิ์ ผู้ใช้อาจไม่เห็นกล่องโต้ตอบสิทธิ์เนื่องจากกิจกรรมแทรมโพลีนจะถูกทำลายก่อนที่ผู้ใช้จะมีโอกาสตอบสนองต่อกล่องโต้ตอบ และอาจมีการคำนวณขนาดและตำแหน่งของกิจกรรมกล่องโต้ตอบอย่างไม่ถูกต้อง
แอปควรเปิดคำขอสิทธิ์จากกิจกรรมที่ยังคงมองเห็นได้เสมอจนกว่าผู้ใช้จะตัดสินใจเกี่ยวกับสิทธิ์
มุมโค้งมน
กิจกรรมอาจโปร่งใสเนื่องจากสไตล์ที่ระบุความโปร่งใสของพื้นหลัง หรือเนื่องจากเนื้อหาของกิจกรรมไม่เต็มพื้นที่แสดงผลที่ใช้ได้ หากกิจกรรมแบบโปร่งใสเติมเต็มพื้นที่แสดงผลที่พร้อมใช้งาน ระบบจะใช้มุมมนกับกิจกรรมโดยอัตโนมัติเมื่อผู้ผลิตอุปกรณ์กำหนดค่าให้ทำเช่นนั้น แต่หากกิจกรรมที่โปร่งใส (เช่น กล่องโต้ตอบสิทธิ์) ไม่ได้เติมเต็มพื้นที่ว่างที่มีอยู่ คุณก็เลือกได้ว่าจะใช้มุมโค้งมนหรือไม่
กล่องโต้ตอบสิทธิ์จะไม่แสดงเต็มพื้นที่แสดงผลที่ใช้ได้ เนื่องจากเลย์เอาต์กล่องโต้ตอบมักจะใช้ LayoutParams.WRAP_CONTENT แทน LayoutParams.MATCH_PARENT
กล่องโต้ตอบที่มีมุมโค้งมนอยู่ในตำแหน่งที่ถูกต้องเหนือกิจกรรมการเปิดตัวที่มองเห็นได้
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
ทำให้กิจกรรมที่เปิดกิจกรรมกล่องโต้ตอบมองเห็นได้จนกว่าผู้ใช้จะตอบกลับกล่องโต้ตอบ
ระบบจะตรวจสอบว่ากิจกรรมแบบโปร่งใสรับค่าข้อจำกัดทั้งหมดจากกิจกรรมแบบทึบแสงแรกที่อยู่ใต้กิจกรรมแบบโปร่งใสในสแต็กกิจกรรม ซึ่งรวมถึงข้อจำกัดที่เกี่ยวข้องกับสิ่งต่อไปนี้
- โหมดความเข้ากันได้ของขนาด
- การวางแนว
- สัดส่วนภาพ
เกม Unity
เกม Unity จะทำงานบน Android แบบเต็มหน้าจอหรือในโหมดหลายหน้าต่าง อย่างไรก็ตาม เกม Unity จำนวนมากจะสูญเสียโฟกัสและหยุดแสดงเนื้อหาเมื่อแอปอยู่ในโหมดหลายหน้าต่าง
ปัญหา
Unity ได้เพิ่มตัวเลือก Resizable Window ใน Unity 2019.4 เพื่อรองรับโหมดหลายหน้าต่างใน Android อย่างไรก็ตาม การติดตั้งใช้งานครั้งแรกไม่ตอบสนองต่อวงจรกิจกรรมในโหมดหลายหน้าต่างอย่างถูกต้อง ทำให้ UnityPlayer หยุดการเล่นชั่วคราวเมื่อแอปสูญเสียโฟกัส เพลเยอร์แสดงหน้าจอสีดำหรือเฟรมสุดท้ายของเกมที่ค้างอยู่ เกมเพลย์จะกลับมาทำงานอีกครั้งเมื่อผู้ใช้แตะหน้าจอเท่านั้น แอปจำนวนมากที่ใช้เครื่องมือ Unity ประสบปัญหานี้และแสดงผลเป็นหน้าต่างสีดำในโหมดหลายหน้าต่าง
เกมสูญเสียโฟกัสในโหมดหลายหน้าต่างและแสดงผลเป็นหน้าต่างสีดำ
การเพิ่มประสิทธิภาพ
อัปเกรด Unity เป็น 2019.4.40 ขึ้นไป แล้วส่งออกเกมอีกครั้ง เลือกตัวเลือก Resizable Window ไว้ในการตั้งค่า Android Player ไม่เช่นนั้นเกมจะหยุดชั่วคราวเมื่อไม่ได้โฟกัส แม้ว่าเกมจะแสดงทั้งหมดในโหมดหลายหน้าต่างก็ตาม
เกมแสดงผลเนื้อหาอย่างถูกต้องในโหมดหลายหน้าต่างแม้ว่าจะไม่ได้โฟกัสอยู่ก็ตาม
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
ผู้ผลิตอุปกรณ์สามารถใช้การลบล้างต่อแอป OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS เพื่อให้เหตุการณ์โฟกัสปลอมแก่แอปในโหมดหลายหน้าต่าง การลบล้างจะช่วยให้กิจกรรมวาดเนื้อหาใหม่ได้และไม่ถูกปิดกั้น
หน้าต่างเดสก์ท็อป
เมื่อแอปทำงานในสภาพแวดล้อมหน้าต่างเดสก์ท็อป แอปอาจพบโหมดความเข้ากันได้เพิ่มเติม
แอปที่มีการล็อกการวางแนวจะปรับขนาดได้อย่างอิสระ แม้ว่ากิจกรรมจะล็อกไว้ที่การวางแนวตั้ง แต่ผู้ใช้ก็ยังคงปรับขนาดแอปเป็นการวางแนวนอนได้
แอปที่มีการล็อกการวางแนวจะยังคงปรับขนาดได้อย่างอิสระ
อย่างไรก็ตาม หากมีการประกาศกิจกรรมว่าปรับขนาดไม่ได้ (resizeableActivity = false) UI ของกิจกรรมจะปรับขนาดโดยยังคงสัดส่วนภาพเดิมไว้
กิจกรรมที่ประกาศว่าปรับขนาดไม่ได้จะมีการปรับขนาด UI
ตัวอย่างจากกล้องในหน้าต่างเดสก์ท็อป
เมื่อแอปทำงานในโหมดหน้าต่างเดสก์ท็อป การหมุนจอแสดงผลและการวางแนวหน้าต่างอาจแตกต่างจากที่ผู้ใช้อาจพบในโหมดเต็มหน้าจอในโทรศัพท์มาตรฐาน
ปัญหา
แอปมักจะถือว่าการวางแนวอุปกรณ์และการวางแนวเซ็นเซอร์ตรวจจับผ่านกล้องเป็นแนวตั้ง ซึ่งอาจส่งผลให้ตัวอย่างภาพจากกล้องไม่ตรงแนวหรือการบิดเบี้ยว
การเพิ่มประสิทธิภาพ
แอปกล้องต้องระบุและจัดการการวางแนวของอุปกรณ์และการวางแนวเซ็นเซอร์กล้องอย่างถูกต้องเพื่อแสดงตัวอย่างภาพจากกล้องที่จัดแนวและปรับขนาดอย่างถูกต้อง แอปต้องคำนวณการหมุนอุปกรณ์ การหมุนเซ็นเซอร์ และสัดส่วนภาพของหน้าต่าง จากนั้นใช้ผลลัพธ์กับการแสดงตัวอย่างจากกล้อง ซึ่งควรตอบสนองต่อการเปลี่ยนแปลงการกำหนดค่าหน้าต่างด้วย ดูคำแนะนำโดยละเอียดได้ที่ตัวอย่างภาพจากกล้อง
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
เมื่อแอปที่มีการวางแนวคงที่ในหน้าต่างเดสก์ท็อปเริ่มแสดงตัวอย่างภาพจากกล้อง ระบบอาจทริกเกอร์การจัดการความเข้ากันได้ของกล้องเพื่อหลีกเลี่ยงตัวอย่างภาพที่ยืดและเอียงข้าง
การจัดการนี้จะแซนด์บ็อกซ์สภาพแวดล้อมให้ตรงกับการวางแนวที่ขอด้วยวิธีต่อไปนี้
แสดงหน้าต่างแอปแบบ Letterbox ตามการวางแนวที่ขอ: เพื่อหลีกเลี่ยงปัญหาการยืดเนื่องจากการปรับขนาดที่ไม่เหมาะสม
แซนด์บ็อกซ์การหมุนจอแสดงผล: การจัดการจะจำลองอุปกรณ์ที่วางในแนวที่ขอ เนื่องจากสมมติฐานที่ไม่ถูกต้องที่พบบ่อยที่สุดสำหรับตัวอย่างภาพจากกล้องคือแอปทำงานบนอุปกรณ์แนวตั้ง การหมุนจอแสดงผลจึงอยู่ในแซนด์บ็อกซ์ที่ 0 องศาสำหรับแอปที่ขอการวางแนวตั้ง และ 90 องศาสำหรับอุปกรณ์ที่ขอการวางแนวนอน
การครอบตัดกล้อง: หากการหมุนจอแสดงผลมีการเปลี่ยนแปลง การเปลี่ยนแปลงนี้จะแสดง ในฟีดกล้อง กล่าวคือ หากอุปกรณ์อยู่ในแนวนอนและมีการทริกเกอร์ การจัดการสำหรับแอปที่ขอแนวตั้ง ขอบเขตการมองเห็นของกล้องจะถูกครอบตัด ให้คล้ายกับกล้องที่วางแนวตั้ง
หมุนและครอบตัดฟีดกล้อง: ระบบจะวนรอบเมธอดกิจกรรม
onStop()และonStart()(โดยค่าเริ่มต้น) หรือonPause()และonResume()(ใช้โดยการลบล้าง OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE ต่อแอป) หลังจากใช้การดูแลเพื่อให้แน่ใจว่าตัวอย่างภาพจากกล้องแสดงอย่างถูกต้อง
นักพัฒนาแอปสามารถลบล้างวิธีแก้ปัญหาเหล่านี้ได้หากแอปจัดการตัวอย่างภาพจากกล้องอย่างถูกต้อง โปรดดูหัวข้อการลบล้างต่อแอป
กำลังปรับขนาด
เมื่อการจัดการการวางแนวที่ขอจำลองทำงานอยู่ การปรับขนาดหน้าต่างจะปรับขนาด UI ช่องมองภาพโดยยังคงสัดส่วนภาพไว้ ส่วนที่เหลือของหน้าต่างแอปจะปรับขนาดได้อย่างอิสระ
การปรับขนาดหน้าต่างด้วยช่องมองภาพของกล้อง
ทดสอบแอปเพื่อหาปัญหาเกี่ยวกับความเข้ากันได้
หากต้องการทดสอบแอปและทำความเข้าใจลักษณะการทำงานของแอปในอุปกรณ์รูปแบบต่างๆ ให้ใช้ประโยชน์จากแหล่งข้อมูลต่อไปนี้
- การสตรีมอุปกรณ์: หากต้องการทดสอบแอปในอุปกรณ์เวอร์ชันที่ใช้งานจริง (รวมถึงอุปกรณ์อ้างอิง) ที่โฮสต์ในศูนย์ข้อมูลของ Google โปรดดูการสตรีมอุปกรณ์ Android ที่ทำงานด้วย Firebase
- โปรแกรมจำลองใน Android Studio: ดูข้อมูลเกี่ยวกับการสร้างโปรแกรมจำลองสำหรับอุปกรณ์อ้างอิงได้ที่หัวข้อสร้างและจัดการอุปกรณ์เสมือนจริง
- โปรแกรมจำลองที่ปรับขนาดได้ของ Android Studio: ดูข้อมูลเกี่ยวกับการเข้าถึงอุปกรณ์เสมือนจริงได้ที่เรียกใช้แอปในโปรแกรมจำลองของ Android
มีแถบดำด้านบน-ล่างของภาพ
ตรวจสอบว่าแต่ละกิจกรรมสามารถใช้พื้นที่แสดงผลทั้งหมดที่แอปมีได้ ก่อนอื่น ให้ประกาศโค้ดต่อไปนี้ในโฟลเดอร์ทดสอบ
Kotlin
fun isLetterboxed(activity: AppCompatActivity): Boolean { if (isInMultiWindowMode) return false val wmc = WindowMetricsCalculator.getOrCreate() val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds val isScreenPortrait = maxBounds.height() > maxBounds.width() return if (isScreenPortrait) { currentBounds.height() < maxBounds.height() } else { currentBounds.width() < maxBounds.width() } }
Java
public boolean isLetterboxed(AppCompatActivity activity) { if (activity.isInMultiWindowMode()) { return false; } WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate(); Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds(); Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds(); boolean isScreenPortrait = maxBounds.height() > maxBounds.width(); return (isScreenPortrait) ? currentBounds.height() < maxBounds.height() : currentBounds.width() < maxBounds.width(); }
จากนั้นทำการทดสอบเพื่อยืนยันลักษณะการทำงานและตรวจสอบว่ากิจกรรมเป้าหมายไม่ได้แสดงแบบ Letterbox โดยทำดังนี้
Kotlin
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertFalse(it.isLetterboxed()) } }
Java
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); @Test public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity( activity -> { assertFalse(activity.isLetterboxed()); }); } }
ตามหลักการแล้ว ให้ทำการทดสอบประเภทนี้จนกว่าจะผ่านและยืนยันว่ากิจกรรมของแอปใช้พื้นที่แสดงผลทั้งหมดที่แอปมี ทดสอบแอปในอุปกรณ์ทุกประเภทเพื่อให้แน่ใจว่ามีลักษณะการทำงานที่สอดคล้องกัน
การลบล้างต่อแอป
Android มีการลบล้างที่เปลี่ยนลักษณะการทำงานที่กำหนดค่าไว้ของแอป ตัวอย่างเช่น การลบล้าง FORCE_RESIZE_APP จะสั่งให้ระบบข้ามโหมดความเข้ากันได้ของขนาดและปรับขนาดแอปให้พอดีกับขนาดจอแสดงผล แม้ว่าจะมีการระบุ resizeableActivity="false" ไว้ในไฟล์ Manifest ของแอปก็ตาม
ผู้ผลิตอุปกรณ์จะใช้การลบล้างกับแอปบางแอปหรือแอปทั้งหมดในอุปกรณ์ที่เฉพาะเจาะจง ใน Android 14 (ระดับ API 34) ขึ้นไป ผู้ใช้สามารถใช้การลบล้างกับแอปผ่านการตั้งค่าอุปกรณ์ได้ ใน Android 16 (ระดับ API 36) ขึ้นไป เจ้าของอุปกรณ์เสมือนจริงจะใช้การลบล้างในอุปกรณ์บางเครื่องที่เจ้าของอุปกรณ์เสมือนจริงจัดการ
การลบล้างต่อแอปของผู้ใช้
ใน Android 14 ขึ้นไป เมนูการตั้งค่าจะช่วยให้ผู้ใช้เปลี่ยนสัดส่วนภาพของแอปได้ อุปกรณ์ที่มีหน้าจอขนาดใหญ่ เช่น อุปกรณ์อ้างอิงจะใช้เมนูนี้
เมนูนี้มีรายการแอปทั้งหมดที่ติดตั้งในอุปกรณ์ ผู้ใช้เลือกแอปแล้วตั้งค่าสัดส่วนภาพของแอปเป็น 3:4, 1:1, เต็มหน้าจอ หรือค่าอื่นๆ ที่ผู้ผลิตอุปกรณ์กำหนดค่าไว้ ผู้ใช้ยังรีเซ็ตสัดส่วนภาพเป็นค่าเริ่มต้นของแอปซึ่งระบุไว้ในไฟล์ Manifest ของแอปได้ด้วย
แอปสามารถเลือกไม่ใช้การลบล้างความเข้ากันได้โดยตั้งค่าแท็ก PackageManager.Property ต่อไปนี้
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
หากต้องการเลือกไม่ใช้การลบล้างความเข้ากันได้ของสัดส่วนภาพของผู้ใช้ ให้เพิ่มพร็อพเพอร์ตี้ลงในไฟล์ Manifest ของแอปและตั้งค่าเป็น
falseดังนี้<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>ระบบจะยกเว้นแอปของคุณจากรายการแอปในการตั้งค่าอุปกรณ์ ผู้ใช้จะลบล้างสัดส่วนการแสดงผลของแอปไม่ได้
การตั้งค่าพร็อพเพอร์ตี้เป็น
trueจะไม่มีผลใดๆPROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
หากต้องการเลือกไม่ใช้ตัวเลือกแบบเต็มหน้าจอของการลบล้างความเข้ากันได้ของสัดส่วนภาพของผู้ใช้ ให้เพิ่มพร็อพเพอร์ตี้ลงในไฟล์ Manifest ของแอปและตั้งค่าเป็น
false:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>ระบบจะนำตัวเลือกแบบเต็มหน้าจอออกจากรายการตัวเลือกสัดส่วนภาพในการตั้งค่าอุปกรณ์ ผู้ใช้จะใช้การลบล้างแบบเต็มหน้าจอกับแอปของคุณไม่ได้
การตั้งค่าพร็อพเพอร์ตี้นี้เป็น
trueจะไม่มีผล
เพิ่มประสิทธิภาพแอปสำหรับหน้าจอทั้งหมด: อย่าตั้งค่าข้อจำกัดสัดส่วนภาพในแอป ใช้คลาสขนาดหน้าต่างเพื่อรองรับเลย์เอาต์ต่างๆ ตามปริมาณพื้นที่แสดงผลที่พร้อมใช้งาน
การลบล้างต่อแอปในอุปกรณ์
ผู้ผลิตอุปกรณ์และเจ้าของอุปกรณ์เสมือนจริง (เลือกแอปที่เชื่อถือได้และมีสิทธิ์) จะใช้การลบล้างเป็นรายแอปในอุปกรณ์ที่เฉพาะเจาะจง ซึ่งรวมถึงแท็บเล็ต อุปกรณ์แบบพับได้ อุปกรณ์ ChromeOS และจอแสดงผลในรถยนต์ อุปกรณ์อ้างอิงอาจใช้การลบล้างบางอย่างกับแอปต่างๆ โดยค่าเริ่มต้น
แอปสามารถเลือกไม่ใช้การลบล้างส่วนใหญ่ได้ (ดูตารางการลบล้างต่อแอปด้านล่าง)
คุณทดสอบแอปโดยเปิดหรือปิดใช้การลบล้างได้โดยใช้เฟรมเวิร์กความเข้ากันได้ (ดูเครื่องมือเฟรมเวิร์กความเข้ากันได้) เมื่อเปิดใช้ การลบล้างจะมีผลกับทั้งแอป
นอกจากนี้ คุณยังใช้ Android Debug Bridge (adb) เพื่อเปิดหรือปิดใช้การลบล้างและกำหนดว่าการลบล้างใดมีผลกับแอปของคุณได้ด้วย
เปิดหรือปิดใช้การลบล้างดังนี้
adb shell am compat enable/disable <override name/id> <package>
สำหรับอุปกรณ์อ้างอิง ให้ตรวจสอบว่าการลบล้างใดมีผลกับแอปของคุณ
adb shell dumpsys platform_compat | grep <package name>
ตารางต่อไปนี้แสดงการลบล้างที่ใช้ได้พร้อมกับคำแนะนำเกี่ยวกับวิธีเพิ่มประสิทธิภาพแอปเพื่อให้แอปไม่ต้องอาศัยการลบล้าง คุณสามารถเพิ่มแฟล็กพร็อพเพอร์ตี้ลงในไฟล์ Manifest ของแอปเพื่อเลือกไม่ใช้การลบล้างบางรายการได้
| การลบล้างต่อแอป | |||
|---|---|---|---|
| ประเภท | ชื่อ | รหัส | คำอธิบาย |
| ความเข้ากันได้ของอินพุต | OVERRIDE_MOUSE_TO_TOUCH | 413207127 | แปลงอินสแตนซ์ MotionEvent จากอุปกรณ์เมาส์เป็นการโต้ตอบแบบสัมผัสโดยการเขียนแหล่งที่มาและประเภทเครื่องมือ MotionEvent ใหม่เมื่อส่งไปยังแอปพลิเคชัน |
| การปรับขนาดได้ | FORCE_RESIZE_APP | 174042936 | ข้ามโหมดความเข้ากันได้ของขนาดสำหรับแอปเมื่อมีการเปลี่ยนแปลงการกำหนดค่า |
| FORCE_NON_RESIZE_APP | 181136395 | บังคับให้แอปเข้าสู่โหมดความเข้ากันได้ของขนาดเมื่อมีการเปลี่ยนแปลงการกำหนดค่า | |
| สัดส่วนภาพ | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | การลบล้าง Gatekeeper ที่ต้องเปิดใช้เพื่อใช้การลบล้างสัดส่วนภาพอื่นๆ |
| OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | หากเปิดใช้ (ค่าเริ่มต้น) จะจำกัดขอบเขตการลบล้างให้ใช้ได้เฉพาะกิจกรรมแนวตั้งเท่านั้น | |
| OVERRIDE_MIN_ASPECT_RATIO_SMALL | 349045028 | เปลี่ยนสัดส่วนภาพขั้นต่ำเป็น 4:3 | |
| OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | เปลี่ยนสัดส่วนภาพขั้นต่ำเป็น 3:2 | |
| OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | เปลี่ยนสัดส่วนภาพขั้นต่ำเป็น 16:9 | |
| OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | เปลี่ยนสัดส่วนภาพขั้นต่ำให้พอดีกับ 50% ของขนาดการแสดงผล (หรือสัดส่วนภาพแบบแยกหน้าจอ) | |
| OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | ปิดใช้การลบล้างสัดส่วนภาพขั้นต่ำเพื่อให้แอปแสดงแบบเต็มหน้าจอเมื่ออุปกรณ์อยู่ในแนวตั้ง | |
| การวางแนว | OVERRIDE_ANY_ORIENTATION | 265464455 | เปิดใช้การลบล้างการวางแนวใดก็ได้ |
| OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | ลบล้างข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนการแสดงผล | |
| OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | ลบล้างการวางแนวให้เป็นแนวตั้งเมื่อกิจกรรมมีการวางแนวที่ไม่ได้กำหนด | |
| OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | ลบล้างการวางแนวเป็น nosensor (ใช้การวางแนวตามธรรมชาติของอุปกรณ์) เมื่อกิจกรรมมีการวางแนวที่ไม่ได้กำหนดไว้ |
|
| OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | หมุนแอปที่แสดงเฉพาะแนวนอน 180 องศา | |
| OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | จำกัดขอบเขตการลบล้างการวางแนวเมื่อแอปเชื่อมต่อกับกล้อง | |
| OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | ตั้งค่าการแสดงผลเป็นแนวนอนคงที่ตามปกติเมื่อทำงานแบบเต็มหน้าจอ (รวมถึงเมื่อแสดงผลแบบ Letterbox) | |
| OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | ละเว้นคำขอการวางแนวจากแอปเพื่อหลีกเลี่ยงการหมุนวนซ้ำไม่สิ้นสุด | |
| OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | ละเว้นคำขอการวางแนวซ้ำๆ ขณะที่กิจกรรมกำลังเปิดอีกครั้ง หาก Android ตรวจพบว่าแอปขอการวางแนวใหม่อย่างน้อย 2 รายการภายใน 1 วินาที ระบบจะถือว่านี่เป็นลูปการหมุนที่ไม่มีที่สิ้นสุดและใช้การลบล้าง | |
| OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | ป้องกันการแสดงผลแบบ Letterbox โดยปิดใช้การตั้งค่า "ละเว้นคำขอการวางแนว" ของผู้ผลิตอุปกรณ์ | |
| Sandbox API | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | ป้องกันการเปลี่ยนแปลงลักษณะการทำงานของ Display API |
| ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | บังคับให้ API Display ในแอปแสดงขอบเขตของแอป API ของ Display จะแสดงผลขอบเขตพื้นที่แสดงผลเชิงตรรกะ แต่บางครั้งแอปจะถือว่า API ของ Display แสดงผลขอบเขตของแอป ซึ่งทำให้เกิดปัญหาเกี่ยวกับ UI |
|
| OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | บังคับให้ API ของ View ที่ใช้ในแอปแสดงขอบเขตของแอป API ของ View จะแสดงผลขอบเขตพื้นที่แสดงผลเชิงตรรกะ แต่บางครั้งแอปจะถือว่า API ของ View แสดงผลขอบเขตของแอป ซึ่งทำให้เกิดปัญหาเกี่ยวกับ UI |
|
| ความเข้ากันได้ของกล้อง | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | ปิดการบังคับหมุน โดยค่าเริ่มต้น ระบบจะบังคับให้หมุนแอปกล้องที่มีการวางแนวคงที่ทั้งหมดเมื่อเปิดตัวอย่างภาพจากกล้อง |
| OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION | 398195815 | ปิดการจำลองการจัดการการวางแนวที่ขอเพื่อความเข้ากันได้ของกล้อง โดยค่าเริ่มต้น แอปกล้องที่มีการวางแนวคงที่จะได้รับการปรับตามการวางแนวที่ขอเมื่อเปิดตัวอย่างภาพจากกล้อง | |
| OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | นำการบังคับรีเฟรชเริ่มต้นที่ใช้เมื่อบังคับหมุนตัวอย่างกล้องออก | |
| OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | เปลี่ยนการรีเฟรชแบบฮาร์ดเป็นการรีเฟรชแบบซอฟต์เมื่อมีการบังคับหมุนตัวอย่างภาพจากกล้อง ซึ่งจะช่วยรักษาสถานะระหว่างการบังคับหมุน โดยค่าเริ่มต้น Android จะใช้การรีเฟรชแบบฮาร์ดเมื่อมีการบังคับหมุนตัวอย่างภาพจากกล้อง การรีเฟรชแบบฮาร์ดรีเฟรชอาจทำให้เกิดปัญหากับแอปที่สูญเสียสถานะหรือหน้าจอดับ ทั้งนี้ขึ้นอยู่กับวิธีที่แอปแคชสถานะก่อนหน้า | |
| OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | ครอบตัดบัฟเฟอร์รูปภาพของกล้องหน้าด้านใน หากปิดใช้การลบล้าง ระบบจะนำการครอบตัดกล้องหน้าด้านในออกและเพิ่มขอบเขตการมองเห็นของตัวอย่างภาพจากกล้อง โดยค่าเริ่มต้นในอุปกรณ์แบบพับได้บางรุ่น (ดูอุปกรณ์อ้างอิง) ระบบจะครอบตัดตัวอย่างภาพจากกล้องของแอปกล้องทั้งหมดเมื่อใช้กล้องหน้าด้านใน | |
| เบ็ดเตล็ด | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | ป้องกันไม่ให้แอปกลายเป็นสีดำเมื่อแอปสูญเสียโฟกัสในโหมดแยกหน้าจอ แอปจะรอให้โฟกัสก่อนที่จะวาดเนื้อหาแอป ซึ่งอาจทำให้แอปค้างหรือหน้าจอเป็นสีดำ การลบล้างนี้ช่วยให้ Android ส่งเหตุการณ์โฟกัสปลอมไปยังแอปได้ ซึ่งจะส่งสัญญาณให้แอปเริ่มวาดเนื้อหาอีกครั้ง |
| OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS | 388014743 | ยกเว้นส่วนแทรกแถบคำอธิบายภาพจากขอบเขตของแอปในการกำหนดค่ากิจกรรมในหน้าต่างเดสก์ท็อป เพื่อป้องกันไม่ให้องค์ประกอบ UI ของแอปด้านบนหรือด้านล่างถูกบดบังโดยแถบคำอธิบายภาพหรือถูกครอบตัดเมื่อแอปไม่จัดการส่วนแทรกแถบคำอธิบายภาพ | |
OVERRIDE_MOUSE_TO_TOUCH
เปิดใช้การจัดการความเข้ากันได้ที่แปลงอินสแตนซ์ MotionEvent จากเมาส์หรือทัชแพดเป็นการโต้ตอบแบบสัมผัสโดยการเขียนแหล่งที่มา MotionEvent ใหม่เป็น SOURCE_TOUCHSCREEN และประเภทเครื่องมือ MotionEvent เป็น TOOL_TYPE_FINGER เมื่อส่งเหตุการณ์การเคลื่อนไหวไปยังแอปพลิเคชัน
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ไม่เกี่ยวข้อง ปัญหานี้ควรได้รับการแก้ไขในตรรกะของแอปพลิเคชัน
วิธีเพิ่มประสิทธิภาพแอป
แอปของคุณควรจัดการเหตุการณ์การป้อนข้อมูลจากเมาส์และทัชแพด รวมถึงท่าทางสัมผัสของทัชแพดและการเลื่อนลูกกลิ้งเมาส์ โปรดดูหัวข้อแป้นพิมพ์ เมาส์ และแทร็กแพด
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ประกาศ FEATURE_PC ในองค์ประกอบ <uses-feature> ในไฟล์ Manifest ของแอปพลิเคชัน
<uses-feature android:name="android.hardware.type.pc"
android:required="false" />
หมายเหตุ: ตั้งค่า android:required="false" เพื่อให้ฟีเจอร์ PC เป็นตัวเลือก และ Google Play ไม่ยกเว้นแอปพลิเคชันในอุปกรณ์ที่ไม่ใช่ PC
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
ไม่มี
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MOUSE_TO_TOUCH <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MOUSE_TO_TOUCH <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
FORCE_RESIZE_APP
บังคับให้แพ็กเกจที่ใช้การลบล้างปรับขนาดได้และเข้าสู่โหมดหลายหน้าต่างได้ ใช้ได้กับจอแสดงผลทุกขนาด
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ในไฟล์ Manifest ของแอป ให้ตั้งค่าแอตทริบิวต์ android:resizeableActivity เป็น true
วิธีเพิ่มประสิทธิภาพแอป
ใช้เลย์เอาต์ที่ปรับเปลี่ยนตามพื้นที่โฆษณา/ปรับเปลี่ยนตามอุปกรณ์เพื่อให้แอปปรับให้เข้ากับจอแสดงผลทุกขนาดและสัดส่วนภาพทั้งหมดได้ ดูรองรับขนาดการแสดงผลต่างๆ
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างและทำให้แอปปรับขนาดได้
adb shell am compat enable FORCE_RESIZE_APP <package>
วิธีนำการลบล้างออก
adb shell am compat disable FORCE_RESIZE_APP <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
FORCE_NON_RESIZE_APP
บังคับให้แพ็กเกจที่ใช้การลบล้างปรับขนาดไม่ได้และเข้าสู่โหมดความเข้ากันได้ของขนาดเมื่อมีการเปลี่ยนแปลงการกำหนดค่า ใช้ได้กับจอแสดงผลทุกขนาด
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าทั้งแอตทริบิวต์ android:resizeableActivity และแฟล็กข้อมูลเมตา android.supports_size_changes เป็น false ในไฟล์ Manifest ของแอป และประกาศข้อจำกัดการวางแนวหรือสัดส่วนภาพ
วิธีเพิ่มประสิทธิภาพแอป
แอปทั้งหมดที่ทำงานได้ดีหากปรับขนาดควรตั้งค่า android:resizeableActivity หรือ android.supports_size_changes เป็น true
แอปอื่นๆ ควรได้รับการปรับปรุงให้ทำงานได้ดีเมื่อปรับขนาด ดู android:resizeableActivity
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างและทำให้แอปปรับขนาดไม่ได้
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
วิธีนำการลบล้างออก
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO
Gatekeeper สำหรับการลบล้างทั้งหมดที่บังคับใช้สัดส่วนภาพขั้นต่ำที่กำหนด
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่า android:minAspectRatio ที่ระดับกิจกรรมหรือแอป
วิธีเพิ่มประสิทธิภาพแอป
อย่าตั้งค่าข้อจำกัดสัดส่วนภาพในแอป ตรวจสอบว่าแอปรองรับขนาดการแสดงผลที่แตกต่างกัน ใช้คลาสขนาดหน้าต่างเพื่อรองรับเลย์เอาต์ต่างๆ ตามปริมาณพื้นที่ที่แอปมีบนหน้าจอ ดู Compose WindowSizeClass API และ View WindowSizeClass API
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ระบุข้อจำกัดสัดส่วนภาพหรือตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
จำกัดการตั้งค่าแอปที่บังคับใช้อัตราส่วนภาพขั้นต่ำที่กำหนดสำหรับกิจกรรมที่มีการวางแนวในแนวตั้งเท่านั้น เปิดใช้โดยค่าเริ่มต้นและจะมีผลก็ต่อเมื่อเปิดใช้ OVERRIDE_MIN_ASPECT_RATIO ด้วย
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_SMALL
ตั้งค่าสัดส่วนภาพขั้นต่ำของกิจกรรมเป็นค่าเล็ก (4:3)
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
ตั้งค่าสัดส่วนภาพขั้นต่ำของกิจกรรมเป็นค่าปานกลาง (3:2)
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_LARGE
ตั้งค่าสัดส่วนภาพขั้นต่ำของกิจกรรมเป็นค่าขนาดใหญ่ (16:9)
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
เปิดใช้สัดส่วนภาพแบบแยกหน้าจอ อนุญาตให้แอปใช้พื้นที่ว่างทั้งหมดในโหมดแยกหน้าจอเพื่อหลีกเลี่ยงการมีแถบดำด้านบน-ล่างของภาพ
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
ปิดใช้การลบล้างสัดส่วนภาพขั้นต่ำในโหมดเต็มหน้าจอแนวตั้งเพื่อใช้พื้นที่หน้าจอทั้งหมดที่มีอยู่
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_ANY_ORIENTATION
เปิดใช้การลบล้างต่อไปนี้เพื่อลบล้างการวางแนวใดๆ
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแอตทริบิวต์ไฟล์ Manifest activity:screenOrientation หรือใช้ Activity#setRequestedOrientation() API
วิธีเพิ่มประสิทธิภาพแอป
แอปของคุณควรรองรับการวางแนวทั้งหมด การเปลี่ยนการวางแนวคือการเปลี่ยนแปลงการกำหนดค่า ซึ่งสามารถจัดการได้ 2 วิธี ได้แก่ การปล่อยให้ระบบทำลายและสร้างแอปใหม่ หรือจัดการการเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง หากคุณจัดการการเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง คุณจะคงสถานะแอปไว้ได้โดยใช้ ViewModel ในบางกรณีที่จำกัดอย่างมาก คุณสามารถเลือกที่จะล็อกการวางแนวบนจอแสดงผลขนาดเล็กเท่านั้น แม้ว่าการทำเช่นนั้นอาจไม่ปรับขนาดได้ดีเท่ากับการอนุญาตให้ผู้ใช้หมุนแอปได้ตามต้องการ ใน Android 12L ขึ้นไป การกำหนดค่าอุปกรณ์จะลบล้างการวางแนวคงที่ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการการเปลี่ยนแปลงการกำหนดค่าและการรองรับการวางแนวทั้งหมดได้ที่จัดการการเปลี่ยนแปลงการกำหนดค่า, ภาพรวมของ ViewModel และการวางแนวแอปถูกจำกัดในโทรศัพท์แต่ไม่ถูกจำกัดในอุปกรณ์หน้าจอขนาดใหญ่
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_ANY_ORIENTATION_TO_USER
ช่วยให้แอปแสดงเต็มพื้นที่หน้าจอที่พร้อมใช้งาน ลบล้างข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนการแสดงผลที่ระบุไว้ในไฟล์ Manifest ของแอป นอกจากนี้ยังละเว้นการเรียกใช้ Activity#setRequestedOrientation() หรือ Activity#getRequestedOrientation() ด้วย
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
อย่าตั้งค่าแอตทริบิวต์ไฟล์ Manifest
android:screenOrientationหรือตั้งค่าแอตทริบิวต์เป็น"user"ตั้งค่าแอตทริบิวต์ไฟล์ Manifest
android:resizeableActivityเป็นtrueในหน้าจอขนาดเล็ก หากต้องการรองรับการปรับขนาดแอปขณะปิดใช้โหมดหลายหน้าต่างด้วย
android:resizeableActivity=falseให้ตั้งค่าแฟล็กข้อมูลเมตาandroid.supports_size_changesเป็นtrueอย่าตั้งค่าminAspectRatioและmaxAspectRatio
วิธีเพิ่มประสิทธิภาพแอป
เปิดใช้แอปเพื่อรองรับการวางแนวทั้งหมด อย่าตั้งค่าข้อกำหนด screenOrientation ในไฟล์ Manifest ของแอป รองรับการปรับขนาดแอป โหมดหลายหน้าต่าง และสัดส่วนการแสดงผลทั้งหมดโดยตั้งค่าแอตทริบิวต์ android:resizeableActivity ในไฟล์ Manifest ของแอปเป็น true ดูรองรับขนาดการแสดงผลต่างๆ
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
เปิดใช้การวางแนวตั้งสำหรับกิจกรรมทั้งหมดในแพ็กเกจ ระบบจะใช้การลบล้างเฉพาะเมื่อกิจกรรมไม่ได้ระบุการวางแนวคงที่อื่นๆ ไว้ เว้นแต่จะเปิดใช้ OVERRIDE_ANY_ORIENTATION
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
เปิดใช้การวางแนว nosensor สำหรับกิจกรรมทั้งหมดในแพ็กเกจ ระบบจะใช้การลบล้างเฉพาะเมื่อกิจกรรมไม่ได้ระบุการวางแนวคงที่อื่นๆ ไว้ เว้นแต่จะเปิดใช้ OVERRIDE_ANY_ORIENTATION
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
เปิดใช้การวางแนว reverseLandscape สำหรับกิจกรรมทั้งหมดในแพ็กเกจ ระบบจะใช้การลบล้างเฉพาะเมื่อกิจกรรมไม่ได้ระบุการวางแนวคงที่อื่นๆ ไว้ เว้นแต่จะเปิดใช้ OVERRIDE_ANY_ORIENTATION
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
จำกัดการลบล้าง OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR และ OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE ให้มีผลเฉพาะเมื่อการเชื่อมต่อกล้องทำงานอยู่เท่านั้น
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
จำกัดการวางแนวจอแสดงผลให้เป็นแนวนอนตามปกติเมื่อเป็นไปตามเงื่อนไขต่อไปนี้
- กิจกรรมแบบเต็มหน้าจอ
- ไม่ได้เปิดใช้พร็อพเพอร์ตี้คอมโพเนนต์การเลือกไม่ใช้
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE - เปิดใช้การตั้งค่า "ผู้ผลิตอุปกรณ์ละเว้นคำขอการวางแนว" สำหรับจอแสดงผล
- การวางแนวตามปกติของจอแสดงผลคือแนวนอน
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ไม่เกี่ยวข้อง ปัญหานี้ควรได้รับการแก้ไขในตรรกะของแอปพลิเคชัน
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
เปิดใช้นโยบายความเข้ากันได้ที่ข้ามการอัปเดตการวางแนวของแอปเพื่อตอบสนองต่อแอปที่เรียกใช้ Activity#setRequestedOrientation() เมื่อแอปเปิดอีกครั้งหรือมีการจัดการความเข้ากันได้ของกล้องที่ใช้งานอยู่
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION เป็น true
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
เปิดใช้นโยบายความเข้ากันได้ที่ละเว้นการวางแนวที่แอปขอเพื่อตอบสนองต่อการเรียก Activity#setRequestedOrientation() ของแอปมากกว่า 2 ครั้งใน 1 วินาที หากกิจกรรมไม่ได้ใช้ Letterbox สำหรับการวางแนวคงที่
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ไม่เกี่ยวข้อง ปัญหานี้ควรได้รับการแก้ไขในตรรกะของแอปพลิเคชัน
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
ยกเว้นแพ็กเกจจากลักษณะการทำงานของคำขอละเว้นการวางแนวที่ผู้ผลิตอุปกรณ์สามารถเปิดใช้สำหรับพื้นที่แสดงผลหรือจอแสดงผลทั้งหมด
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ไม่เกี่ยวข้อง ปัญหานี้ควรได้รับการแก้ไขในตรรกะของแอปพลิเคชัน
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
เลือกไม่ใช้ไม่ได้ การปิดใช้การลบล้างอาจเป็นอันตรายหากแอปเข้ากันไม่ได้กับอุปกรณ์ที่เปิดใช้การตั้งค่า "ผู้ผลิตอุปกรณ์ละเว้นคำขอการวางแนว" ติดต่อฝ่ายลูกค้าสัมพันธ์ของนักพัฒนาแอป Android เพื่อปิดใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
ไม่มีแฟล็กพร็อพเพอร์ตี้สำหรับการลบล้างนี้
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
NEVER_SANDBOX_DISPLAY_APIS
บังคับให้แพ็กเกจไม่มีการใช้แซนด์บ็อกซ์ API ของ Display สำหรับกิจกรรมในโหมด Letterbox หรือโหมดความเข้ากันได้ของขนาด API Display จะยังคงระบุขอบเขตพื้นที่แสดงผลต่อไป
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ประกาศกิจกรรมที่ปรับขนาดได้โดยตั้งค่าแอตทริบิวต์ไฟล์ Manifest android:resizeableActivity เป็น true หรือแฟล็กข้อมูลเมตา android.supports_size_changes เป็น true
วิธีเพิ่มประสิทธิภาพแอป
แอปที่ประกาศว่าปรับขนาดได้อย่างเต็มรูปแบบไม่ควรอาศัยขนาดจอแสดงผลในการจัดตำแหน่งองค์ประกอบ UI ย้ายข้อมูลแอปไปยัง API ที่อัปเดตแล้วซึ่งมี WindowMetrics หากใช้ Jetpack Compose ให้ใช้ประโยชน์จาก API WindowSizeClass เพื่อวาด UI ตามพื้นที่หน้าจอที่แอปมีในจอแสดงผลปัจจุบัน ดูใช้คลาสขนาดหน้าต่าง
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
เลือกไม่ใช้ไม่ได้ ย้ายข้อมูลจาก API ที่เลิกใช้งานแล้ว
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
ไม่มีแฟล็กพร็อพเพอร์ตี้สำหรับการลบล้างนี้
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>
วิธีนำการลบล้างออก
adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
ALWAYS_SANDBOX_DISPLAY_APIS
บังคับให้แพ็กเกจใช้แซนด์บ็อกซ์ API Display เสมอ ไม่ว่าจะอยู่ในโหมดการจัดการหน้าต่างใดก็ตาม API ของ Display จะระบุขอบเขตของแอปเสมอ
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ประกาศกิจกรรมที่ปรับขนาดไม่ได้โดยตั้งค่าแอตทริบิวต์ android:resizeableActivity เป็น false หรือตั้งค่าแฟล็กข้อมูลเมตา android.supports_size_changes เป็น false
วิธีเพิ่มประสิทธิภาพแอป
แอปที่ประกาศว่าปรับขนาดได้อย่างเต็มที่ ไม่ควรใช้ขนาดจอแสดงผลเพื่อจัดตำแหน่งองค์ประกอบ UI ย้ายข้อมูลแอปจาก API ที่เลิกใช้งานแล้วไปยัง API ที่อัปเดตซึ่งมีWindowMetrics ดูWindowMetricsCalculator
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
เลือกไม่ใช้ไม่ได้ ย้ายข้อมูลจาก API ที่เลิกใช้งานแล้ว
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
ไม่มีแฟล็กพร็อพเพอร์ตี้สำหรับการลบล้างนี้
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>
วิธีนำการลบล้างออก
adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
บังคับให้แพ็กเกจแซนด์บ็อกซ์ API View ต่อไปนี้ไปยังขอบเขตกิจกรรม
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
แก้ไขปัญหาในโค้ดของแอปพลิเคชันโดยใช้ API ที่ระบุขอบเขตของหน้าต่างแอปและออฟเซ็ตที่สัมพันธ์กับหน้าต่างแอป แทนที่จะเป็นขอบเขตของการแสดงผลในอุปกรณ์และออฟเซ็ตที่สัมพันธ์กับการแสดงผลในอุปกรณ์
วิธีเพิ่มประสิทธิภาพแอป
แอปควรใช้ API View โดยคำนึงถึงความเป็นไปได้ที่จะมีการใช้ Letterbox และโหมดหลายหน้าต่างกับแอป ดูWindowMetricsCalculator
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
ปิดใช้การบังคับหมุน ปรับปรุงประสบการณ์ของผู้ใช้ในบางแอป
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION เป็น false
วิธีเพิ่มประสิทธิภาพแอป
อย่าใช้การวางแนวเซ็นเซอร์ตรวจจับผ่านกล้องหรือข้อมูลอุปกรณ์ที่แคชไว้ ดูคำแนะนำเกี่ยวกับความเข้ากันได้ของกล้องได้ที่ขอแนะนำช่องมองภาพของกล้องและรองรับแพลตฟอร์มที่ปรับขนาดได้ในแอปกล้อง
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION เป็น true
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างซึ่งจะนำการบังคับหมุนออก
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
วิธีนำการลบล้างออก ซึ่งจะทำให้เกิดการบังคับหมุนหน้าจอ
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION
ปิดใช้การจำลองการจัดการการวางแนวที่ขอสำหรับกล้อง ปรับปรุงประสบการณ์ของผู้ใช้ในบางแอป
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION เป็น false
วิธีเพิ่มประสิทธิภาพแอป
อย่าใช้การวางแนวเซ็นเซอร์ตรวจจับผ่านกล้องหรือข้อมูลอุปกรณ์ที่แคชไว้ ดูคำแนะนำเกี่ยวกับความเข้ากันได้ของกล้องได้ที่ขอแนะนำช่องมองภาพของกล้องและรองรับแพลตฟอร์มที่ปรับขนาดได้ในแอปกล้อง
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
เนื่องจากพร็อพเพอร์ตี้นี้ปิดใช้การจัดการความเข้ากันได้ คุณจึงปรับปรุงประสบการณ์ของผู้ใช้ได้โดยพิจารณาการเปลี่ยนแปลงการหมุนหน้าจอแบบไดนามิก การวางแนวเซ็นเซอร์ของอุปกรณ์ รวมถึงขนาดหน้าต่างและขนาดตัวอย่าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างซึ่งจะนำการจำลองการวางแนวที่ขอออก
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>
วิธีนำการลบล้างออก ซึ่งจะช่วยให้จำลองการวางแนวที่ขอได้
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
ปิดใช้การรีเฟรชกิจกรรมหลังจากบังคับให้หมุนหน้าจอ ปรับปรุงประสบการณ์ของผู้ใช้เมื่อการรีเฟรชทำให้สถานะในแอปหายไป
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH เป็น false
วิธีเพิ่มประสิทธิภาพแอป
ดู OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH เป็น true
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างซึ่งจะนำการรีเฟรชกิจกรรมออก
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
วิธีนำการลบล้างออก ซึ่งจะอนุญาตให้รีเฟรชกิจกรรมได้
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
ทำให้แพ็กเกจที่ใช้ทำการรีเฟรชกิจกรรมโดยใช้วงจร onResume() → onPause() → onResume() แทนที่จะเป็น onResume() → onStop() → onResume() หลังจากบังคับหมุนเพื่อความเข้ากันได้ของกล้อง
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE เป็น true
วิธีเพิ่มประสิทธิภาพแอป
ดู OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
บังคับให้ครอบตัดเอาต์พุตของกล้องเป็นการวางแนวตรงกันข้ามเมื่อการวางแนวกล้องแนวตั้งไม่สอดคล้องกับการวางแนวอุปกรณ์ตามปกติ แอปจำนวนมากไม่จัดการกับสถานการณ์นี้และแสดงรูปภาพที่ยืดออก
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT เป็น true
วิธีเพิ่มประสิทธิภาพแอป
ดู OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างซึ่งจะใช้การครอบตัดกล้องหน้าด้านใน
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
วิธีนำการลบล้างออก ซึ่งจะนำการครอบตัดกล้องหน้าด้านในออกด้วย
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
ป้องกันไม่ให้แอปเลือกไม่ใช้การแชร์หน้าจอเฉพาะแอป (ดูการฉายสื่อ) ใช้เมื่อแอปใช้ API createConfigForDefaultDisplay() ในทางที่ผิดเพื่อบังคับให้จับภาพแบบเต็มหน้าจอและเป็นอันตรายต่อความเป็นส่วนตัวของผู้ใช้โดยการเปิดเผยเนื้อหาของการแจ้งเตือน ซึ่งจะจับภาพแบบเต็มหน้าจอแต่ไม่ใช่การแชร์หน้าจอเฉพาะแอป และแอปทั้งหมดไม่ว่าจะอยู่ในโหมดการแสดงผลแบบหน้าต่างใดก็ตาม
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
อนุญาตลักษณะการทำงานของการฉายภาพสื่อเริ่มต้น (ใช้งานใน Android 14, API ระดับ 34 พร้อม createScreenCaptureIntent()) ซึ่งช่วยให้ผู้ใช้ตัดสินใจได้ว่าจะแชร์แบบเต็มหน้าจอหรือหน้าต่างแอปเดียว ไม่ว่าจะใช้โหมดการแสดงผลหน้าต่างแบบใดก็ตาม หรือเรียกใช้ createScreenCaptureIntent(MediaProjectionConfig) โดยมีอาร์กิวเมนต์ MediaProjectionConfig ที่แสดงผลจากการเรียกใช้ createConfigForUserChoice()
วิธีเพิ่มประสิทธิภาพแอป
อนุญาตให้ผู้ใช้เลือกว่าจะแชร์จอแสดงผลของอุปกรณ์ทั้งหมดหรือหน้าต่างแอปในระหว่างการฉายภาพสื่อ ซึ่งเป็นลักษณะการทำงานเริ่มต้นตั้งแต่ Android 14 เป็นต้นไป
ทำให้แอปปรับขนาดได้ (resizeableActivity="true") เพื่อรองรับโหมดหลายหน้าต่าง
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
เนื่องจากความเป็นส่วนตัวของผู้ใช้เป็นเรื่องสำคัญ แอปของคุณจึงไม่สามารถปิดใช้หรือเลือกไม่ใช้การลบล้างนี้ได้
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
ไม่มี
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง ซึ่งจะยกเลิกการเลือกไม่ใช้การแชร์หน้าจอบางส่วนของแอป (นั่นคือเปิดใช้การแชร์หน้าจอบางส่วน)
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
หากต้องการนำการลบล้างออก ซึ่งจะทำให้แอปเลือกไม่ใช้การแชร์หน้าจอบางส่วนได้ ให้ทำดังนี้
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
เปิดใช้การส่งโฟกัสปลอมสำหรับแอปที่ไม่ได้โฟกัสในโหมดแยกหน้าจอ เกมเอนจินบางตัวจะรอให้ได้รับโฟกัสก่อนที่จะวาดเนื้อหาของแอป ดังนั้นโฟกัสปลอมจึงช่วยให้แอปไม่แสดงหน้าจอสีดำเมื่อกลับมาทำงานอีกครั้งและยังไม่ได้รับโฟกัส
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ENABLE_FAKE_FOCUS เป็น true
วิธีเพิ่มประสิทธิภาพแอป
คุณสามารถหลีกเลี่ยงปัญหานี้ได้หากแอปของคุณจัดการการวางแนวและการเปลี่ยนแปลงการกำหนดค่าหลายรายการได้ดี เปิดใช้แอปเพื่อรองรับรูปแบบของอุปกรณ์และโหมดการแสดงผลหน้าต่างแอปทั้งหมดโดยทำตามหลักเกณฑ์ด้านคุณภาพของแอปที่ปรับเปลี่ยนตามอุปกรณ์
หากคุณใช้เกมเอนจิน Unity ให้อัปเกรดเป็นเวอร์ชัน 2019.4.40 ขึ้นไป แล้วส่งออกเกมอีกครั้ง เลือกตัวเลือกหน้าต่างที่ปรับขนาดได้ไว้ในการตั้งค่า Android Player
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ENABLE_FAKE_FOCUS เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
ยกเว้นส่วนแทรกแถบคำบรรยายจากขอบเขตของแอปในการกำหนดค่ากิจกรรมในหน้าต่างเดสก์ท็อป เพื่อป้องกันไม่ให้องค์ประกอบ UI ของแอปด้านบนหรือด้านล่างถูกบดบังด้วยแถบคำบรรยายหรือถูกครอบตัดเมื่อแอปไม่ได้จัดการส่วนแทรกแถบคำบรรยาย
โดยปกติแล้ว ส่วนแทรกแถบคำบรรยายจะไม่ถูกยกเว้นจากขอบเขตของแอปในการกำหนดค่า และ Configuration.screenHeightDp และขอบเขตของแอปจะรายงานความสูงของหน้าต่างทั้งหมด รวมถึงพื้นที่ด้านหลังแถบคำบรรยายของหน้าต่างเดสก์ท็อป (แถบชื่อที่มีตัวควบคุมการย่อ ขยาย และปิด ซึ่งจะยังคงมองเห็นได้แม้ในโหมดใหญ่พิเศษ)
- แอปแบบไร้ขอบหรือแอปที่สมจริงซึ่งไม่จัดการส่วนแทรกของแถบคำอธิบายภาพ: พื้นที่เลย์เอาต์ของแอปจะครอบคลุมทั้งหน้าต่าง ดังนั้นหากแอปไม่ค้นหา
WindowInsetsเพื่อชดเชย UI ของแอป ตัวควบคุมด้านบนจะวาดใต้แถบคำอธิบายภาพโดยตรง - แอปที่ระบบบังคับใช้ส่วนแทรกแถบคำบรรยาย: เพื่อป้องกันไม่ให้แอปวาดภาพด้านหลังแถบคำบรรยาย ระบบจะเลื่อนมุมมองรูทของแอปลงไปด้านล่างแถบคำบรรยาย หากแอปกำหนดขนาดเลย์เอาต์โดยใช้
Configuration.screenHeightDpที่ไม่ได้ปรับหรือขอบเขตของแอปแทนขนาดวิวพอร์ต แอปจะแสดงผลเลย์เอาต์ความสูงเต็มหน้าต่างโดยเริ่มจากใต้แถบคำอธิบายภาพ ซึ่งจะดันองค์ประกอบ UI ด้านล่างให้เลยขอบด้านล่างของหน้าต่างและทำให้เป้าหมายการสัมผัสไม่ตรงแนว
เมื่อเปิดใช้การลบล้าง ระบบจะลบความสูงของแถบคำอธิบายภาพออกจากขอบเขตของแอปและ Configuration.screenHeightDp เพื่อให้พื้นที่เลย์เอาต์ของแอปสอดคล้องกับพื้นที่ใต้แถบคำอธิบายภาพ
วิธีที่แอปจะได้รับผลลัพธ์เดียวกันกับการลบล้าง
เปิดใช้การแสดงผลแบบไร้ขอบ โปรดดูข้อมูลต่อไปนี้
- Compose: เกี่ยวกับส่วนที่เว้นไว้ในหน้าต่าง
- มุมมอง: แสดงเนื้อหาแบบเต็มหน้าจอในมุมมอง
- การกำหนดค่า: การเปลี่ยนแปลงลักษณะการทำงาน: แอปที่กำหนดเป้าหมายเป็น Android 15 ขึ้นไป
วิธีเพิ่มประสิทธิภาพแอป
คุณหลีกเลี่ยงปัญหานี้ได้หากแอปเปิดใช้การแสดงผลแบบไร้ขอบ
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าแฟล็กพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>
หมายเหตุ: คำสั่งจะใช้หรือนำการลบล้างออกชั่วคราวเท่านั้น
แหล่งข้อมูลเพิ่มเติม
-
เจ้าของอุปกรณ์เสมือนจริงคือแอปที่เชื่อถือได้หรือมีสิทธิ์ซึ่งจัดการอุปกรณ์เสมือนจริง เจ้าของอุปกรณ์เสมือนจริงจะสร้างอุปกรณ์เสมือนจริงเพื่อแสดงผลแอป แล้วฉายแอปไปยังอุปกรณ์ระยะไกล เช่น คอมพิวเตอร์ส่วนบุคคล อุปกรณ์เทคโนโลยีความจริงเสมือน (VR) หรือระบบสาระบันเทิงในรถยนต์ เจ้าของอุปกรณ์เสมือนจริงอยู่ในอุปกรณ์ในพื้นที่ เช่น โทรศัพท์ ↩