โหมดความเข้ากันได้ของอุปกรณ์

Android จะเปิดใช้งานโหมดความเข้ากันได้สำหรับแอปที่ประกาศการจำกัดการวางแนวหรือ การปรับขนาด โหมดความเข้ากันได้ช่วยให้มั่นใจว่าแอปจะทำงานได้อย่างเหมาะสมในอุปกรณ์หน้าจอขนาดใหญ่และโทรศัพท์ฝาพับ แต่จะใช้งานได้ไม่ดีเท่าที่ควร

การลบล้างต่อแอปช่วยให้ผู้ผลิตอุปกรณ์ เจ้าของอุปกรณ์เสมือน1 และผู้ใช้สามารถเปลี่ยนลักษณะการทำงานของแอปเพื่อปรับปรุงเลย์เอาต์ของแอปหรือป้องกันไม่ให้แอปใช้งานไม่ได้ในอุปกรณ์บางรุ่น

Android 16

Android 16 (API ระดับ 36) จะไม่สนใจข้อจำกัดด้านการวางแนวหน้าจอ สัดส่วนการแสดงผล และความสามารถในการปรับขนาดของแอปเพื่อปรับปรุงเลย์เอาต์ของแอปในรูปแบบของอุปกรณ์ที่มีความกว้างที่เล็กที่สุด >= 600dp

การลบล้างต่อแอปต่อไปนี้จะใช้ไม่ได้กับแอปที่กำหนดเป้าหมายเป็น API ระดับ 36

เลือกไม่ใช้

แอปของคุณสามารถกำหนดเป้าหมายเป็น API ระดับ 36 แต่เลือกไม่ใช้ลักษณะการทำงานของ Android 16 ได้ ในกรณีนี้ OVERRIDE_ANY_ORIENTATION_TO_USER จะใช้ไม่ได้

ประกาศพร็อพเพอร์ตี้ไฟล์ Manifest

หากต้องการเลือกไม่ใช้ลักษณะการทํางานของ API ระดับ 36 ให้ประกาศPROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITYพร็อพเพอร์ตี้ไฟล์ Manifest

หากต้องการเลือกไม่ใช้กิจกรรมที่เฉพาะเจาะจง ให้ตั้งค่าพร็อพเพอร์ตี้ในองค์ประกอบ <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>

อุปกรณ์อ้างอิง

อุปกรณ์ต่อไปนี้อาจต้องมีการลบล้างต่อแอปเนื่องจากการกำหนดค่าที่ผิดปกติ หรือการกำหนดค่าที่แอปไม่รองรับ

  • แท็บเล็ต: แท็บเล็ตบางรุ่น เช่น Pixel Tablet จะอยู่ในแนวนอนโดยค่าเริ่มต้น อุปกรณ์จะอยู่ในแนวนอนตามปกติเมื่อ Display#getRotation() แสดงผล Surface.ROTATION_0 หากแอปถือว่า ROTATION_0 เป็นแนวตั้ง เลย์เอาต์ของแอปและพรีวิวของกล้องอาจไม่ตรงกับจอแสดงผลของอุปกรณ์
  • อุปกรณ์พับได้แนวนอน: อุปกรณ์พับได้บางรุ่น เช่น Pixel Fold จะอยู่ใน แนวตั้งเมื่อพับ แต่จะอยู่ในแนวนอนเมื่อกางออก หากแอปถือว่าการวางแนวที่กางออกเป็นแนวตั้ง การกะพริบ วนซ้ำหรือปัญหาเลย์เอาต์อาจเกิดขึ้นได้
  • โทรศัพท์ฝาพับแบบพับได้: โทรศัพท์ฝาพับที่กางออกมักจะอยู่ในแนวนอน แต่เมื่อพับแล้ว โทรศัพท์มักจะมีจอแสดงผลขนาดเล็กใน แนวนอน แอปต้องระบุและรองรับการวางแนวของจอแสดงผลที่แตกต่างกัน
  • จอแสดงผลภายนอก: อุปกรณ์บางรุ่นสามารถเริ่มเซสชันการแสดงหน้าต่างบนเดสก์ท็อป ในจอแสดงผลภายนอกที่เชื่อมต่อ แอปต้องค้นหาจอแสดงผลภายนอกเพื่อดู ข้อมูล เช่น ขนาดหน้าจอและความละเอียด มิฉะนั้นแอปอาจ คาดการณ์เกี่ยวกับจอแสดงผลไม่ถูกต้อง ซึ่งอาจส่งผลให้แอปทํางานไม่ถูกต้อง
  • จอแสดงผลในรถยนต์: จอแสดงผลในรถยนต์จำนวนมากเป็นแนวนอน แต่ไม่ใช่ทั้งหมด การพัฒนาแอปที่จอดรถสำหรับจอแสดงผลในรถยนต์จะคล้ายกับการพัฒนาสำหรับแท็บเล็ต

ปัญหาด้านความเข้ากันได้ที่พบบ่อย

แอปมักประสบปัญหาด้านความเข้ากันได้เนื่องจากข้อจำกัดด้านการวางแนวของแอป ข้อจำกัดด้านความสามารถในการปรับขนาดและสัดส่วนภาพ การจัดการการวางแนวของ พรีวิวกล้องที่ไม่ถูกต้อง และการใช้ API ในทางที่ผิด

เล็ทเทอร์บ็อกซิง

การแสดงผลแบบจอกว้างจะวางแอปไว้ตรงกลางหน้าจอ หรือในหน้าจอขนาดใหญ่ จะวางไว้ที่ด้านใดด้านหนึ่งเพื่อให้เข้าถึงได้สะดวก แมตต์ (แถบสีทึบหรือวอลเปเปอร์เบลอ) จะเติมพื้นที่แสดงผลที่ไม่ได้ใช้ตามด้านข้างหรือด้านบนและด้านล่างของแอป

การเกิดแถบดำด้านบนและด้านล่างมักเกิดขึ้นในอุปกรณ์หน้าจอขนาดใหญ่ เนื่องจากมิติข้อมูลและ สัดส่วนภาพของจอแสดงผลในอุปกรณ์มักจะแตกต่างจากของโทรศัพท์มาตรฐาน ซึ่งเป็นอุปกรณ์ที่แอปส่วนใหญ่ออกแบบมาให้ใช้งาน

รูปที่ 1 แอปที่จำกัดเฉพาะการวางแนวตั้งจะแสดงเป็นแถบดำด้านข้างบนแท็บเล็ตแนวนอนและอุปกรณ์แบบพับได้

ปัญหา

แอปไม่รองรับการกำหนดค่าการแสดงผลทั้งหมดเนื่องจากแอปมี การวางแนวคงที่ อัตราส่วนคงที่ หรือปรับขนาดไม่ได้

การตั้งค่าการกำหนดค่าที่ควบคุมการวางแนวและความสามารถในการปรับขนาดของแอป ได้แก่ รายการต่อไปนี้

  • screenOrientation: ระบุการวางแนวคงที่สำหรับ แอป แอปยังตั้งค่าการวางแนวที่รันไทม์ได้โดยใช้ Activity#setRequestedOrientation()

  • resizeableActivity: ระบุว่าระบบสามารถ ปรับขนาดแอปให้พอดีกับหน้าต่างที่มีขนาดต่างๆ ได้หรือไม่ ใน Android 11 (API ระดับ 30) และต่ำกว่า จะระบุว่าแอปต่างๆ รองรับโหมดหลายหน้าต่างหรือไม่ ใน Android 12 (API ระดับ 31) ขึ้นไป จะระบุว่าแอป รองรับโหมดหลายหน้าต่างในหน้าจอขนาดเล็ก (คลาสขนาดหน้าต่างแบบกะทัดรัด) หรือไม่ ใน Android 12 ขึ้นไป แอปจะรองรับโหมดหลายหน้าต่างบนหน้าจอขนาดใหญ่ (คลาสขนาดหน้าต่างปานกลางหรือขยาย) โดยไม่คำนึงถึงการตั้งค่านี้

  • maxAspectRatio: ระบุสัดส่วนภาพสูงสุด ที่แอปรองรับ เฉพาะแอปที่ตั้งค่า resizeableActivity เป็น false เท่านั้นที่ตั้งค่า maxAspectRatio ได้

  • minAspectRatio: ระบุสัดส่วนภาพขั้นต่ำที่แอป รองรับ เฉพาะแอปที่มี resizeableActivity ตั้งค่าเป็น false เท่านั้นที่ ตั้งค่า minAspectRatio ได้

การเพิ่มประสิทธิภาพ

แอปควรรองรับการแสดงผลในอุปกรณ์ทั้งหมดและโหมดหลายหน้าต่าง การวางแนวและขนาด นําข้อจํากัดด้านการวางแนวและสัดส่วนคงที่ ทั้งหมดออกจากเลย์เอาต์แอปและไฟล์ Manifest ของแอป

วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้

หากแอปที่มีการวางแนวหรือสัดส่วนภาพคงที่ทำงานในหน้าต่างที่ แอปไม่รองรับขนาดหรือการวางแนวของหน้าต่างโดยตรง Android จะ ใส่แถบดำด้านข้างแอปเพื่อรักษาความต่อเนื่อง

เริ่มตั้งแต่ Android 12 (API ระดับ 31) และต่อเนื่องไปจนถึง 12L (API ระดับ 32) แพลตฟอร์มจะใช้การเพิ่มประสิทธิภาพที่หลากหลายกับแอปที่แสดงแบบกล่องจดหมาย ผู้ผลิต อุปกรณ์จะใช้การเพิ่มประสิทธิภาพ UI คุณไม่จำเป็นต้องพัฒนาแอปเพิ่มเติมเพื่อรับประโยชน์จากการปรับปรุง

Android 12 (API ระดับ 31) มีการปรับปรุงด้านความสวยงามต่อไปนี้ ซึ่งผู้ผลิตอุปกรณ์สามารถกำหนดค่าได้

  • มุมโค้ง: มุมของหน้าต่างแอปดูสวยงามยิ่งขึ้น
  • ความโปร่งใสของแถบระบบ: แถบสถานะและแถบนำทางที่ซ้อนทับแอปจะมีความโปร่งใสบางส่วน ทำให้ไอคอนในแถบมองเห็นได้เสมอเมื่ออยู่เหนือพื้นหลังที่มีแถบดำด้านบน-ล่างของภาพ
  • สัดส่วนการแสดงผลที่กำหนดค่าได้: ปรับสัดส่วนการแสดงผลของแอปได้ เพื่อปรับปรุงรูปลักษณ์ของแอป

รูปที่ 2 แอปที่มีแถบดำด้านข้างพร้อมการเพิ่มประสิทธิภาพ UI

12L (API ระดับ 32) มีการปรับปรุงฟังก์ชันการทำงานดังต่อไปนี้

  • การวางตำแหน่งที่กำหนดค่าได้: ในหน้าจอขนาดใหญ่ ผู้ผลิตอุปกรณ์สามารถ วางตำแหน่งแอปไว้ทางด้านซ้ายหรือขวาของจอแสดงผล ซึ่งจะช่วยให้ โต้ตอบได้ง่ายขึ้น

  • ปุ่มรีสตาร์ทที่ออกแบบใหม่: ผู้ผลิตอุปกรณ์สามารถปรับโฉมปุ่มรีสตาร์ท สำหรับโหมดความเข้ากันได้ของขนาด เพื่อให้ผู้ใช้จดจำได้ดียิ่งขึ้น

Android 13 (API ระดับ 33) เพิ่มกล่องโต้ตอบการให้ความรู้แก่ผู้ใช้เกี่ยวกับการวางตำแหน่งแอปที่มีแถบดำด้านข้างบนหน้าจอหรือการรวมแถบดำด้านข้างในโหมดแยกหน้าจอ

รูปที่ 3 แอปที่มีแถบดำด้านบนและด้านล่างพร้อมกล่องโต้ตอบการให้ความรู้แก่ผู้ใช้

โหมดความเข้ากันได้ของขนาด

โหมดความเข้ากันได้ของขนาดคือการแสดงผลแบบจดหมายที่รักษาสัดส่วนภาพของแอปและ มีการควบคุมการรีสตาร์ท โดยตัวควบคุมนี้ช่วยให้ผู้ใช้รีสตาร์ทแอปและ วาดจอแสดงผลใหม่ได้ Android จะเรียกใช้โหมดความเข้ากันได้ของขนาดสำหรับแอปที่ ปรับขนาดไม่ได้ เมื่อกิจกรรมย้ายไปยังคอนเทนเนอร์จอแสดงผลที่ไม่เข้ากัน กับขนาดของกิจกรรม ระบบอาจปรับขนาดแอปเพื่อเติมเต็มจอแสดงผลของอุปกรณ์ ในมิติข้อมูลอย่างน้อย 1 มิติ

การเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ที่อาจทําให้เกิดโหมดความเข้ากันได้ของขนาดมีดังนี้

  • การหมุนอุปกรณ์
  • อุปกรณ์ที่พับได้กำลังพับหรือกางออก
  • เปลี่ยนระหว่างโหมดการแสดงผลแบบเต็มหน้าจอและแบบแยกหน้าจอ

ปัญหา

โดยปกติแล้ว โหมดความเข้ากันได้ของขนาดจะใช้กับกิจกรรมที่ถูกจำกัดใน การวางแนวหรือสัดส่วนภาพ และได้รับการกำหนดค่า (หรือระบบกำหนด) ให้ ปรับขนาดไม่ได้

ระบบจะถือว่าแอปของคุณปรับขนาดได้และจะไม่วางแอปในโหมดความเข้ากันได้ของขนาด หากแอปมีคุณสมบัติตรงตามเกณฑ์ต่อไปนี้

หากแอปไม่เป็นไปตามเงื่อนไขใดๆ ระบบจะถือว่าแอปปรับขนาดไม่ได้และอาจอยู่ในโหมดความเข้ากันได้ของขนาด

การเพิ่มประสิทธิภาพ

แอปควรรองรับขนาดการแสดงผลทั้งหมด ทำให้แอปปรับขนาดได้โดยการตั้งค่าแอตทริบิวต์ android:resizeableActivityขององค์ประกอบ <activity> หรือ <application> เป็น true ใน ไฟล์ Manifest ของแอป ออกแบบเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์/เลย์เอาต์ที่ปรับตามขนาดหน้าจอสำหรับแอปของคุณ ดูข้อมูลเพิ่มเติมได้ที่รองรับขนาดการแสดงผลต่างๆ และรองรับโหมดหลายหน้าต่าง

วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้

Android จะนำแอปไปไว้ในโหมดความเข้ากันได้ของขนาดเมื่อระบบพิจารณาว่าการแสดงแอปที่อยู่ในกรอบดำสามารถปรับปรุงได้โดยการปรับขนาดแอปให้เต็มหน้าต่างแสดงผลในมิติข้อมูลอย่างน้อย 1 มิติ ระบบจะแสดงตัวควบคุมการรีสตาร์ท ซึ่งจะสร้างกระบวนการของแอปขึ้นใหม่ สร้างกิจกรรมขึ้นใหม่ และวาด จอแสดงผลใหม่ ดูภาพรวมกระบวนการและเธรดด้วย

โหมดความเข้ากันได้ของการแสดงผล

โหมดความเข้ากันได้ของการแสดงผลจะป้องกันไม่ให้แอปรีสตาร์ทเมื่อแอปย้าย ระหว่างจอแสดงผลต่างๆ ซึ่งอาจทําให้เกิดการเปลี่ยนแปลงการกําหนดค่า เช่น โหมดสี ความพร้อมใช้งานของหน้าจอสัมผัส หรือ ความหนาแน่นของหน้าจอ

ระบบจะเปิดใช้โหมดความเข้ากันได้ของการแสดงผลสำหรับเกมโดยค่าเริ่มต้น (อิงตามแฟล็ก android:appCategory) เพื่อปรับปรุงความเสถียรและความต่อเนื่อง โหมดความเข้ากันได้ของการแสดงผลจะไม่หยุดการกำหนดค่าของแอปไว้เหมือนกับโหมดความเข้ากันได้ของขนาด แอปจะยังคงรับการอัปเดตการกำหนดค่าทั้งหมดผ่าน API เช่น Callback onConfigurationChanged() ได้ แต่จะไม่ต้องรีสตาร์ท ที่รบกวนการทำงาน ซึ่งหมายความว่าเกมที่รองรับ API อย่างเหมาะสม เช่น onConfigurationChanged() จะยังคงอัปเดต UI ได้อย่างรวดเร็วแม้ว่าจะอยู่ใน โหมดความเข้ากันได้ของการแสดงผลก็ตาม

หากต้องการเลือกไม่ใช้โหมดความเข้ากันได้ของการแสดงผลและจัดการการเปลี่ยนแปลงการกำหนดค่าในแอป ให้ประกาศการรองรับการเปลี่ยนแปลงการกำหนดค่าในไฟล์ AndroidManifest.xml ของแอป และจัดการการเปลี่ยนแปลงการกำหนดค่าในแฮนเดิลการเรียกกลับ 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() ในเมธอด กิจกรรม 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 จะบังคับ หมุนแอปเพื่อจัดแนวหน้าต่างแนวตั้งของแอปให้สอดคล้องกับ การวางแนวตามธรรมชาติของอุปกรณ์

    ในแท็บเล็ตบางรุ่น (ดูอุปกรณ์อ้างอิง) ระบบจะหมุนหน้าต่างแนวตั้งของแอปเป็นแนวตั้งแบบเต็มหน้าจอเพื่อให้สอดคล้องกับ การวางแนวตามธรรมชาติของอุปกรณ์ แอปจะแสดงเต็มหน้าจอหลังจากหมุน โดยบังคับ

    ในหน้าจอภายในแนวนอนของอุปกรณ์พับได้ (ดูอุปกรณ์อ้างอิง) ระบบจะหมุนกิจกรรมที่ใช้ได้เฉพาะแนวตั้งเป็นแนวนอนเพื่อให้สอดคล้องกับแนวการวางตามธรรมชาติเมื่อกางออก แอปจะ มีแถบดำด้านข้างหลังจากหมุนโดยบังคับ

  • การครอบตัดกล้องหน้าด้านใน: เซ็นเซอร์กล้องหน้าด้านในของโทรศัพท์แบบพับได้บางรุ่นจะอยู่ในแนวนอน นอกจากจะบังคับหมุน ตัวอย่างกล้องบนจอแสดงผลด้านในแบบพับได้แล้ว Android ยังครอบตัดขอบเขตการมองเห็นของกล้องหน้าด้านใน (แนวนอน) เพื่อให้เซ็นเซอร์จับภาพมุมมองตรงข้าม กับการวางแนวของอุปกรณ์

  • บังคับรีเฟรชตัวอย่างกล้อง: ระบบจะหมุนเวียนผ่านวิธีการตรวจหากิจกรรม onStop() และ onStart() (ค่าเริ่มต้น) หรือ onPause() และ onResume() (ใช้โดยOVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE การลบล้างต่อแอป) หลังจากหมุนเวียนเพื่อตรวจสอบว่าตัวอย่างกล้องแสดงอย่างถูกต้อง

  • การปรับขนาดสัดส่วนภาพ: ระบบจะเปลี่ยนสัดส่วนภาพของ ตัวอย่างกล้องที่หมุนโดยบังคับแบบไดนามิกเป็นสัดส่วนภาพขั้นต่ำที่สูงขึ้น ซึ่ง ช่วยให้มั่นใจว่าตัวอย่างกล้องจะได้รับการปรับขนาดอย่างเหมาะสม

นักพัฒนาแอปสามารถลบล้างวิธีแก้ปัญหาเหล่านี้ได้หากแอปจัดการตัวอย่างกล้องอย่างถูกต้อง ดูการลบล้างต่อแอป

API ที่มักถูกนำไปใช้ในทางที่ผิด

เนื่องจาก Android ได้เพิ่มการรองรับฟีเจอร์ต่างๆ เช่น โหมดหลายหน้าต่างและ อุปกรณ์ต่างๆ เช่น อุปกรณ์พับได้ เราจึงเลิกใช้งาน API เดิมและแทนที่ด้วย API ที่อัปเดตล่าสุดซึ่งใช้ได้กับขนาดการแสดงผลและรูปแบบอุปกรณ์ทั้งหมด อย่างไรก็ตาม API ที่เลิกใช้งานแล้วจะยังคงใช้งานได้เพื่อความเข้ากันได้แบบย้อนหลัง

View API บางรายการออกแบบมาเพื่อวัตถุประสงค์พิเศษที่นักพัฒนาแอปอาจไม่เข้าใจดีนัก

ปัญหา

นักพัฒนาแอปยังคงใช้ DisplayAPI ที่เลิกใช้งานแล้วและเข้าใจผิดว่า API จะแสดงขอบเขตของแอปแทนขอบเขตพื้นที่แสดงผลของอุปกรณ์ หรือนักพัฒนาแอป ใช้ API ของมุมมองแบบพิเศษเพื่อรับเมตริกการแสดงผลทั่วไปโดยไม่ตั้งใจ ซึ่งจะส่งผลให้เกิดการคำนวณผิดเมื่อจัดตำแหน่งองค์ประกอบ UI ใหม่หลังจากเหตุการณ์การปรับขนาดหน้าต่างแอป ทำให้เกิดปัญหาเกี่ยวกับเลย์เอาต์

API Display ที่เลิกใช้งานแล้วและมีการใช้ในทางที่ผิดโดยทั่วไป

ดูข้อมูลเพิ่มเติมได้ที่ รองรับโหมดหลายหน้าต่าง

API การดูที่ถูกนำไปใช้ในทางที่ผิด:

การเพิ่มประสิทธิภาพ

อย่าวางตำแหน่งองค์ประกอบ UI โดยอิงตามขนาดการแสดงผลจริง ย้ายข้อมูลแอปไปยัง API ที่อิงตาม WindowMetrics ซึ่งรวมถึง API ต่อไปนี้ WindowManager

วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้

การลบล้าง 2 รายการจะปรับ Display API ที่เลิกใช้งานแล้วและ View API ที่ใช้ในทางที่ผิดเพื่อ แสดงขอบเขตของแอป ALWAYS_SANDBOX_DISPLAY_APIS สำหรับ Display API และ OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS สำหรับ View API 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 สามารถ มีสไตล์ที่ทำให้กิจกรรมโปร่งใสได้

กิจกรรมโปร่งใสไม่ครอบคลุมพื้นที่โฆษณา Display ที่มีทั้งหมด ซึ่งทําให้จัดการได้ยากเนื่องจากพื้นที่โฆษณา Display ที่มีอาจเปลี่ยนแปลงได้ตามการเปลี่ยนแปลงการกําหนดค่า เช่น การหมุนอุปกรณ์ การพับและกางอุปกรณ์ และโหมดหลายหน้าต่าง

ปัญหา

กิจกรรมโปร่งใสควรเป็นไปตามขอบเขตของกิจกรรมทึบแสงแรก ด้านล่างกิจกรรมโปร่งใสในสแต็กกิจกรรมของงาน อย่างไรก็ตาม กิจกรรมที่ทึบแสงซึ่งเปิดกล่องโต้ตอบสิทธิ์อาจเป็นแทรมโพลีน (กิจกรรมที่เปิดกิจกรรมอื่นแล้วหายไป) และระบบจึงไม่สามารถกำหนดขอบเขตของกิจกรรมแทรมโพลีนที่เปิดกิจกรรมกล่องโต้ตอบสิทธิ์แบบโปร่งใสได้

การเพิ่มประสิทธิภาพ

กิจกรรมโปร่งใสจะรับช่วงข้อจำกัดจากกิจกรรมทึบแสงที่อยู่บนสุด ซึ่งอยู่ใต้กิจกรรมดังกล่าวในสแต็กกิจกรรมของงาน กิจกรรมที่ไม่โปร่งใสต้องพร้อมใช้งานตลอดวงจรของกิจกรรมที่โปร่งใส ตั้งแต่การสร้างกิจกรรมไปจนถึงการทำลาย ด้วยเหตุนี้ จึงไม่ควรเปิดคำขอสิทธิ์จากกิจกรรม Trampoline

หากกิจกรรมแทรมโพลีนเปิดคำขอสิทธิ์ ผู้ใช้อาจไม่เห็นกล่องโต้ตอบสิทธิ์เนื่องจากกิจกรรมแทรมโพลีนจะถูกทำลายก่อนที่ผู้ใช้จะมีโอกาสตอบกลับกล่องโต้ตอบ และระบบอาจคำนวณขนาดและตำแหน่งของกิจกรรมกล่องโต้ตอบไม่ถูกต้อง

แอปควรเปิดคำขอสิทธิ์จากกิจกรรมที่ยังคง มองเห็นได้จนกว่าผู้ใช้จะตัดสินใจเกี่ยวกับสิทธิ์

มุมมน

กิจกรรมอาจโปร่งใสเนื่องจากรูปแบบที่ระบุความโปร่งใสของพื้นหลัง หรือเนื่องจากเนื้อหาของกิจกรรมไม่เติมพื้นที่แสดงผลที่มีอยู่ หากกิจกรรมโปร่งใสเติมเต็มพื้นที่แสดงผลที่มีอยู่ ระบบจะใช้มุมโค้งกับกิจกรรมโดยอัตโนมัติเมื่อผู้ผลิตอุปกรณ์กำหนดค่าให้ทำเช่นนั้น แต่หากกิจกรรมโปร่งใส (เช่น กล่องโต้ตอบสิทธิ์) ไม่เติมพื้นที่ว่างที่มีอยู่ คุณจะต้องเป็นผู้กำหนดว่าจะใช้มุมโค้งหรือไม่

กล่องโต้ตอบสิทธิ์จะไม่เติมพื้นที่แสดงผลที่ใช้ได้เนื่องจากเลย์เอาต์ของกล่องโต้ตอบ มักใช้ 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 มิฉะนั้น เกมจะหยุดชั่วคราวเมื่อไม่ได้โฟกัส แม้ว่าเกมจะมองเห็นได้ทั้งหมดใน โหมดหลายหน้าต่าง

วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้

ผู้ผลิตอุปกรณ์สามารถใช้การลบล้างต่อแอป OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS เพื่อส่งเหตุการณ์โฟกัสปลอมไปยังแอปใน โหมดหลายหน้าต่าง การลบล้างจะช่วยให้กิจกรรมวาดเนื้อหาใหม่และ ไม่ถูกปิดกั้น

หน้าต่างเดสก์ท็อป

เมื่อแอปทำงานในสภาพแวดล้อมการแสดงหน้าต่างบนเดสก์ท็อป แอปอาจพบ โหมดความเข้ากันได้เพิ่มเติม

แอปที่มีการวางแนวที่ล็อกจะปรับขนาดได้อย่างอิสระ แม้ว่ากิจกรรมจะล็อกเป็นการวางแนวตั้ง แต่ผู้ใช้ยังคงปรับขนาดแอปเป็นการวางแนวนอนได้

ภาพเคลื่อนไหวของแอปแนวตั้งที่เปลี่ยนขนาดเป็นแนวนอน

อย่างไรก็ตาม หากประกาศกิจกรรมเป็นแบบปรับขนาดไม่ได้ (resizeableActivity = false) UI ของกิจกรรมจะปรับขนาดในขณะที่ยังคง สัดส่วนภาพเดิม

ภาพเคลื่อนไหวของการปรับขนาดแอป UI จะปรับขนาดให้เต็มหน้าต่างเดสก์ท็อป

การแสดงตัวอย่างจากกล้องในหน้าต่างเดสก์ท็อป

เมื่อแอปในระบบหน้าต่างบนเดสก์ท็อปเริ่มแสดงตัวอย่างกล้อง ช่องมองภาพจะมี UI ที่ปรับขนาดในขณะที่ยังคงอัตราส่วนเดิมไว้ ส่วนที่เหลือของหน้าต่างแอปสามารถ ปรับขนาดได้อย่างอิสระ

ทดสอบแอปเพื่อหาปัญหาความเข้ากันได้

หากต้องการทดสอบแอปและทำความเข้าใจลักษณะการทำงานของแอปในอุปกรณ์รูปแบบต่างๆ ให้ใช้ประโยชน์จากแหล่งข้อมูลต่อไปนี้

มีแถบดำด้านบน-ล่างของภาพ

ตรวจสอบว่าแต่ละกิจกรรมใช้พื้นที่แสดงผลทั้งหมดที่แอปมีได้ ก่อนอื่น ให้ประกาศโค้ดต่อไปนี้ในโฟลเดอร์ทดสอบ

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();
}

จากนั้นเรียกใช้การทดสอบเพื่อยืนยันลักษณะการทำงานและตรวจสอบว่ากิจกรรมเป้าหมายไม่ได้ อยู่ในกรอบจดหมาย

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 ของแอปเพื่อเลือกไม่ใช้การลบล้างบางอย่างได้

การลบล้างต่อแอป
ประเภท ชื่อ รหัส คำอธิบาย
การปรับขนาดได้ 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 ตั้งค่าการแสดงผลเป็นแนวนอนคงที่เมื่องานเป็นแบบเต็มหน้าจอ (รวมถึงเมื่อมีแถบดำด้านบนและด้านล่าง)
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 ป้องกันการแสดงจอดำบนและล่างโดยการปิดใช้การตั้งค่าคำขอการวางแนวที่ผู้ผลิตอุปกรณ์เพิกเฉย
API แซนด์บ็อกซ์ NEVER_SANDBOX_DISPLAY_APIS 184838306 ป้องกันการเปลี่ยนแปลงลักษณะการทำงานของ API การแสดงผล
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 บังคับให้ Display API ในแอปแสดงขอบเขตของแอป Display API จะแสดงขอบเขตพื้นที่แสดงผลเชิงตรรกะ แต่บางครั้งแอปจะถือว่า Display API แสดงขอบเขตของแอป ซึ่งทำให้เกิดปัญหาเกี่ยวกับ UI
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 บังคับให้ ViewAPI ที่ใช้ในแอปแสดงขอบเขตของแอป View API จะแสดงขอบเขตพื้นที่แสดงผลเชิงตรรกะ แต่บางครั้งแอปจะถือว่า View API แสดงขอบเขตของแอป ซึ่งทำให้เกิดปัญหาเกี่ยวกับ UI
ความเข้ากันได้ของกล้อง OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 ปิดการหมุนบังคับ โดยค่าเริ่มต้น ระบบจะหมุนแอปกล้องที่กำหนดการวางแนวทั้งหมดโดยอัตโนมัติเมื่อเปิดตัวอย่างกล้อง
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 ส่งเหตุการณ์โฟกัสปลอมไปยังแอปได้ ซึ่งจะส่งสัญญาณให้แอปเริ่มวาดเนื้อหาอีกครั้ง

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

ตัวควบคุมการลบล้างทั้งหมดที่บังคับใช้สัดส่วนภาพขั้นต่ำที่กำหนด

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ตั้งค่า 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 ด้วย

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู 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)

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

คำสั่ง 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)

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

คำสั่ง 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)

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

คำสั่ง 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

เปิดใช้การใช้อัตราส่วนภาพแบบแยกหน้าจอ อนุญาตให้แอปใช้พื้นที่ทั้งหมด ที่มีในโหมดแยกหน้าจอเพื่อหลีกเลี่ยงการแสดงภาพแบบจอกว้าง

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

คำสั่ง 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

ปิดใช้การลบล้างสัดส่วนภาพขั้นต่ำในโหมดเต็มหน้าจอแนวตั้งเพื่อใช้พื้นที่หน้าจอทั้งหมด ที่มี

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_MIN_ASPECT_RATIO

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู OVERRIDE_MIN_ASPECT_RATIO

คำสั่ง 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

เปิดใช้การลบล้างต่อไปนี้เพื่อลบล้างการวางแนว

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ตั้งค่าแอตทริบิวต์ไฟล์ Manifest ของ activity:screenOrientation หรือใช้ API ของ Activity#setRequestedOrientation()

วิธีเพิ่มประสิทธิภาพแอป

แอปของคุณควรรองรับการวางแนวทั้งหมด การเปลี่ยนการวางแนวเป็นการ เปลี่ยนแปลงการกำหนดค่า ซึ่งจัดการได้ 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 ดู รองรับขนาดการแสดงผลต่างๆ

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

คำสั่ง 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 ระบบจะใช้การลบล้าง เฉพาะในกรณีที่กิจกรรมไม่ได้ระบุการวางแนวคงที่อื่นๆ

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_ORIENTATION

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู 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

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_ORIENTATION

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู 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

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_ORIENTATION

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู 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 จะมีผลเมื่อการเชื่อมต่อกล้องทำงานอยู่เท่านั้น

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_ORIENTATION

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ดู OVERRIDE_ANY_ORIENTATION

คำสั่ง 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
  • เปิดใช้การตั้งค่าคำขอการวางแนวที่ผู้ผลิตอุปกรณ์เพิกเฉยสำหรับ จอแสดงผล
  • การวางแนวการแสดงผลตามธรรมชาติคือแนวนอน

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ไม่สามารถใช้งาน ควรแก้ปัญหาในตรรกะของแอปพลิเคชัน

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_ORIENTATION

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ตั้งค่าสถานะพร็อพเพอร์ตี้ 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

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_ORIENTATION

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ตั้งค่าสถานะพร็อพเพอร์ตี้ 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 สำหรับการวางแนวคงที่

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ไม่สามารถใช้งาน ควรแก้ปัญหาในตรรกะของแอปพลิเคชัน

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_ORIENTATION

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

ตั้งค่าสถานะพร็อพเพอร์ตี้ 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

ยกเว้นแพ็กเกจจากลักษณะการทำงานของคำขอไม่สนใจการวางแนวที่ผู้ผลิตอุปกรณ์เปิดใช้ได้ สำหรับพื้นที่แสดงผลหรือการแสดงผลทั้งหมด

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ไม่สามารถใช้งาน ควรแก้ปัญหาในตรรกะของแอปพลิเคชัน

วิธีเพิ่มประสิทธิภาพแอป

ดู OVERRIDE_ANY_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 หรือโหมดความเข้ากันได้ของขนาด Display API จะยังคงระบุขอบเขตพื้นที่แสดงผลต่อไป

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ประกาศว่ากิจกรรมปรับขนาดได้โดยตั้งค่าแอตทริบิวต์ android:resizeableActivity ในไฟล์ Manifest เป็น true หรือตั้งค่า Flag ข้อมูลเมตา 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

บังคับให้แพ็กเกจใช้แซนด์บ็อกซ์ Display API เสมอ ไม่ว่าจะอยู่ในโหมดการแสดงหน้าต่างใดก็ตาม Display API จะระบุขอบเขตของแอปเสมอ

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

ประกาศว่ากิจกรรมไม่สามารถปรับขนาดได้โดยตั้งค่าแอตทริบิวต์ 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 ที่ระบุขอบเขตของ หน้าต่างแอปและออฟเซ็ตที่สัมพันธ์กับหน้าต่างแอปแทนที่จะเป็นขอบเขตของ จอแสดงผลของอุปกรณ์และออฟเซ็ตที่สัมพันธ์กับจอแสดงผลของอุปกรณ์

วิธีเพิ่มประสิทธิภาพแอป

แอปควรใช้ View API โดยคำนึงถึงความเป็นไปได้ที่จะเกิดการแสดงผลแบบแถบดำด้านบนและด้านล่าง และโหมดหลายหน้าต่างที่ใช้กับแอป ดู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_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

เมื่อเปิดใช้การลบล้าง กิจกรรมจะได้รับการกำหนดค่าพร้อมกับ การแทรกแถบคำบรรยายแทนเสียง โดยปกติแล้ว การแทรกแถบคำบรรยายแทนเสียงจะแยกจากการกำหนดค่า

วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง

เปิดใช้การแสดงผลแบบไร้ขอบหรืออัปเดต SDK เป้าหมายของแอปเป็น API ระดับ 35 ขึ้นไป โปรดดูข้อมูลต่อไปนี้

วิธีเพิ่มประสิทธิภาพแอป

คุณหลีกเลี่ยงปัญหานี้ได้หากแอปเปิดใช้การแสดงผลแบบขอบจรดขอบหรือ กำหนดเป้าหมายเป็น API ระดับ 35 ขึ้นไป

วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง

เปิดใช้การแสดงผลแบบไร้ขอบหรือกำหนดเป้าหมายเป็น API ระดับ 35 ขึ้นไป

แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง

ไม่มี

คำสั่ง 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>

หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น

แหล่งข้อมูลเพิ่มเติม


  1. เจ้าของอุปกรณ์เสมือนจริงคือแอปที่เชื่อถือได้หรือมีสิทธิ์ซึ่งจัดการอุปกรณ์เสมือนจริง เจ้าของอุปกรณ์เสมือนสร้างอุปกรณ์เสมือนเพื่อแสดงผลแอป แล้วจึงฉายภาพแอปไปยังอุปกรณ์ระยะไกล เช่น คอมพิวเตอร์ส่วนบุคคล อุปกรณ์เสมือนจริง หรือระบบสาระบันเทิงในรถยนต์ เจ้าของอุปกรณ์เสมือนอยู่ในอุปกรณ์ในพื้นที่ เช่น โทรศัพท์