แพลตฟอร์ม Android 12 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้จะมีผลกับแอปทั้งหมดเมื่อแอปทำงานบน Android 12 โดยไม่คำนึงถึง targetSdkVersion
คุณควร
ทดสอบแอป แล้วแก้ไขตามที่จำเป็นเพื่อรองรับฟีเจอร์เหล่านี้อย่างเหมาะสมในกรณีที่
เกี่ยวข้อง
อย่าลืมตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลกับแอปที่กำหนดเป้าหมายเป็น Android 12 เท่านั้นด้วย
ประสบการณ์ของผู้ใช้
เอฟเฟกต์การเลื่อนเกินขอบเขตแบบยืด
ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ลักษณะการทำงานของภาพสำหรับเหตุการณ์การเลื่อนเกินจะเปลี่ยนไป
ใน Android 11 และต่ำกว่า เหตุการณ์การเลื่อนเกินจะทำให้องค์ประกอบภาพมี แสงเรือง ส่วนใน Android 12 ขึ้นไป องค์ประกอบภาพจะยืดและดีดกลับเมื่อเกิด เหตุการณ์การลาก และจะดีดกลับเมื่อเกิดเหตุการณ์การปัด
ดูข้อมูลเพิ่มเติมได้ที่คู่มือการสร้างภาพเคลื่อนไหวให้ท่าทางสัมผัสการเลื่อน
หน้าจอเริ่มต้นของแอป
หากก่อนหน้านี้คุณได้ใช้หน้าจอแนะนำที่กำหนดเองใน Android 11 หรือต่ำกว่า คุณจะต้องย้ายข้อมูลแอปไปยัง SplashScreen
API เพื่อให้แน่ใจว่าแอปจะแสดงอย่างถูกต้องใน Android 12 เป็นต้นไป การไม่ย้ายข้อมูลแอปจะส่งผลให้
ประสบการณ์การเปิดตัวแอปแย่ลงหรือไม่เป็นไปตามที่ตั้งใจ
ดูวิธีการได้ที่ย้ายข้อมูลการใช้งานหน้าจอแนะนําที่มีอยู่ไปยัง Android 12
นอกจากนี้ ตั้งแต่ Android 12 เป็นต้นไป ระบบจะใช้หน้าจอเริ่มต้นเริ่มต้นของระบบ Android ใหม่เสมอเมื่อเริ่มแบบเย็นและเริ่มแบบอุ่นสำหรับแอปทั้งหมด
โดยค่าเริ่มต้น ระบบจะสร้างหน้าจอเริ่มต้นเริ่มต้นนี้โดยใช้
องค์ประกอบไอคอนตัวเรียกใช้ของแอปและ
windowBackground
ของ
ธีม (หากเป็นสีเดียว)
ดูรายละเอียดเพิ่มเติมได้ที่คู่มือนักพัฒนาซอฟต์แวร์สำหรับหน้าจอเริ่มต้น
การแก้ปัญหาความตั้งใจบนเว็บ
ตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป Intent เว็บทั่วไปจะเปลี่ยนเส้นทางไปยัง กิจกรรมในแอปของคุณก็ต่อเมื่อแอปได้รับการอนุมัติสำหรับโดเมนที่เฉพาะเจาะจง ซึ่งอยู่ใน Intent เว็บนั้น หากแอปไม่ได้รับอนุมัติสำหรับโดเมนนั้น Web Intent จะเปลี่ยนเส้นทางไปยังแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน
แอปจะได้รับการอนุมัตินี้โดยทำอย่างใดอย่างหนึ่งต่อไปนี้
ยืนยันโดเมนโดยใช้ลิงก์แอป Android
ในแอปที่กำหนดเป้าหมายเป็น Android 12 ขึ้นไป ระบบจะเปลี่ยนวิธียืนยัน โดยอัตโนมัติ สำหรับ Android App Link ของแอป ใน intent filters ของแอป ให้ตรวจสอบว่าคุณได้รวม
BROWSABLE
category และรองรับhttps
schemeใน Android 12 ขึ้นไป คุณสามารถยืนยัน ด้วยตนเอง สำหรับ Android App Link ของแอปเพื่อทดสอบว่าตรรกะที่อัปเดตนี้ส่งผลต่อแอปของคุณอย่างไร
ขอให้ผู้ใช้เชื่อมโยงแอปของคุณกับ โดเมน ในการตั้งค่าระบบ
หากแอปเรียกใช้ Web Intent ให้พิจารณาเพิ่มข้อความแจ้งหรือกล่องโต้ตอบที่ขอให้ผู้ใช้ยืนยันการดำเนินการ
การปรับปรุงโหมดสมจริงสำหรับการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัส
Android 12 จะรวมลักษณะการทำงานที่มีอยู่เพื่อให้ผู้ใช้เรียกใช้คำสั่งการนำทางด้วยท่าทางสัมผัสขณะอยู่ในโหมดสมจริงได้ง่ายขึ้น นอกจากนี้ Android 12 ยังมีลักษณะการทำงานที่เข้ากันได้แบบย้อนหลังสำหรับโหมด สมจริงแบบติดหนึบด้วย
Display#getRealSize และ getRealMetrics: การเลิกใช้งานและข้อจำกัด
อุปกรณ์ Android มีให้เลือกในรูปแบบต่างๆ มากมาย เช่น หน้าจอขนาดใหญ่ แท็บเล็ต และอุปกรณ์แบบพับได้ แอปต้องกำหนดขนาดหน้าจอหรือจอแสดงผลเพื่อแสดงเนื้อหาอย่างเหมาะสมสำหรับอุปกรณ์แต่ละเครื่อง
ตลอดระยะเวลาที่ผ่านมา
Android ได้จัดเตรียม API ต่างๆ สำหรับการดึงข้อมูลนี้ ใน Android
11 เราได้เปิดตัว WindowMetrics
API และเลิกใช้วิธีการต่อไปนี้
ใน Android 12 เรายังคงแนะนำให้ใช้ WindowMetrics
และจะ
เลิกใช้งานวิธีการต่อไปนี้
เพื่อลดลักษณะการทำงานของแอปพลิเคชันที่ใช้ Display API เพื่อดึงข้อมูลขอบเขตของแอปพลิเคชัน Android 12 จึงจำกัดค่าที่ API แสดงผลสำหรับแอปที่ปรับขนาดไม่ได้ทั้งหมด ซึ่งอาจส่งผลกระทบต่อแอปที่ใช้ข้อมูลนี้กับ MediaProjection
แอปควรใช้ WindowMetrics
API เพื่อค้นหาขอบเขตของ
หน้าต่าง และ Configuration.densityDpi
เพื่อค้นหาความหนาแน่นปัจจุบัน
หากต้องการให้เข้ากันได้กับ Android เวอร์ชันเก่าๆ ในวงกว้าง คุณสามารถใช้ไลบรารี Jetpack WindowManager
ซึ่งมีคลาส WindowMetrics
ที่รองรับ Android 4.0 (API ระดับ 14) ขึ้นไป
ตัวอย่างวิธีใช้ WindowMetrics
ก่อนอื่น โปรดตรวจสอบว่ากิจกรรมของแอปปรับขนาดได้อย่างเต็มที่
กิจกรรมควรใช้ WindowMetrics
จากบริบทของกิจกรรมสำหรับงานที่เกี่ยวข้องกับ UI โดยเฉพาะ WindowManager.getCurrentWindowMetrics()
หรือ WindowMetricsCalculator.computeCurrentWindowMetrics()
ของ Jetpack
หากแอปสร้าง MediaProjection
ขนาดขอบเขตต้องถูกต้อง
เนื่องจากการฉายภาพจะจับภาพพาร์ติชันการแสดงผลที่แอปโปรเจ็กเตอร์
กำลังทำงานอยู่
หากแอปปรับขนาดได้อย่างเต็มที่ บริบทของกิจกรรมจะแสดงขอบเขตที่ถูกต้อง ดังนี้
Kotlin
val projectionMetrics: WindowMetrics = activityContext .getSystemService(WindowManager::class.java).maximumWindowMetrics
Java
WindowMetrics projectionMetrics = activityContext .getSystemService(WindowManager.class).getMaximumWindowMetrics();
หากแอปปรับขนาดไม่ได้ทั้งหมด แอปจะต้องค้นหาจากWindowContext
อินสแตนซ์และเรียกข้อมูลWindowMetrics
ของขอบเขตกิจกรรมโดยใช้
WindowManager.getMaximumWindowMetrics()
หรือเมธอด Jetpack
WindowMetricsCalculator.computeMaximumWindowMetrics()
Kotlin
val windowContext = context.createWindowContext(mContext.display!!, WindowManager.LayoutParams.TYPE_APPLICATION, null) val projectionMetrics = windowContext.getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
Context windowContext = context.createWindowContext(mContext.getDisplay(), WindowManager.LayoutParams.TYPE_APPLICATION, null); WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class) .getMaximumWindowMetrics();
แอปทั้งหมดในโหมดหลายหน้าต่าง
Android 12 ทำให้โหมดหลายหน้าต่างเป็นลักษณะการทำงานมาตรฐาน
ในหน้าจอขนาดใหญ่ (sw >= 600dp) แพลตฟอร์มจะรองรับแอปทั้งหมดในโหมดหลายหน้าต่างโดยไม่คำนึงถึงการกำหนดค่าแอป หาก
resizeableActivity="false"
จำเป็นต้องปรับขนาดการแสดงผล แอปจะเข้าสู่โหมดความเข้ากันได้
ในหน้าจอขนาดเล็ก (sw < 600dp) ระบบจะตรวจสอบ
minWidth
และ
minHeight
ของกิจกรรมเพื่อพิจารณาว่ากิจกรรมนั้นจะเรียกใช้ในโหมดหลายหน้าต่างได้หรือไม่ หาก
resizeableActivity="false"
แอปจะถูกป้องกันไม่ให้ทำงานในโหมดหลายหน้าต่างไม่ว่าจะมี
ความกว้างและความสูงขั้นต่ำเท่าใดก็ตาม
ดูข้อมูลเพิ่มเติมได้ที่การรองรับหลายหน้าต่าง
ตัวอย่างจากกล้องถ่ายรูปบนหน้าจอขนาดใหญ่
โดยทั่วไปแอปกล้องจะสันนิษฐานว่าการวางแนวของ อุปกรณ์กับสัดส่วนภาพพรีวิวของกล้องมีความสัมพันธ์กันแบบตายตัว แต่รูปแบบของอุปกรณ์หน้าจอขนาดใหญ่ เช่น อุปกรณ์พับได้ และโหมดการแสดงผล เช่น แบบหลายหน้าต่างและหลายจอแสดงผล อาจทำให้สมมติฐานดังกล่าวไม่ถูกต้อง
ใน Android 12 แอปกล้องที่ขอการวางแนวหน้าจอที่เฉพาะเจาะจงและปรับขนาดไม่ได้ (resizeableActivity="false"
) จะเข้าสู่โหมดภาพบุคคลแบบแทรกโดยอัตโนมัติ
ซึ่งจะช่วยให้มั่นใจได้ว่าการวางแนวและสัดส่วน
ของภาพตัวอย่างกล้องถูกต้อง ในอุปกรณ์แบบพับได้และอุปกรณ์อื่นๆ ที่มีเลเยอร์การแยกฮาร์ดแวร์ของกล้อง (HAL)
ระบบจะหมุนเอาต์พุตของกล้องเพิ่มเติมเพื่อชดเชยการวางแนวเซ็นเซอร์ของกล้อง และจะครอบตัดเอาต์พุตของกล้องให้ตรงกับสัดส่วนภาพ
ของตัวอย่างกล้องของแอป การครอบตัดและการหมุนเพิ่มเติมช่วยให้มั่นใจได้ว่า
การนำเสนอตัวอย่างกล้องจะเหมาะสม ไม่ว่าอุปกรณ์จะวางแนวใดและพับ
หรือไม่พับก็ตาม
ความล่าช้าของ UX สำหรับการแจ้งเตือนบริการที่ทำงานอยู่เบื้องหน้า
อุปกรณ์ที่ใช้ Android 12 ขึ้นไปจะหน่วงเวลาการแสดงการแจ้งเตือนของบริการที่ทำงานอยู่เบื้องหน้าได้ 10 วินาที โดยมีข้อยกเว้นบางประการ เพื่อมอบประสบการณ์การใช้งานที่ราบรื่นสำหรับบริการที่ทำงานอยู่เบื้องหน้าที่ทำงานในระยะเวลาสั้นๆ การเปลี่ยนแปลงนี้จะช่วยให้งานที่ใช้เวลาสั้นๆ มีโอกาสเสร็จสมบูรณ์ก่อนที่การแจ้งเตือนจะปรากฏ
ประสิทธิภาพ
ที่เก็บข้อมูลสแตนด์บายแอปที่ถูกจำกัด
Android 11 (API ระดับ 30) ได้เปิดตัวที่เก็บข้อมูลที่จำกัด การเข้าถึงเป็น App Standby Bucket ตั้งแต่ Android 12 เป็นต้นไป ที่เก็บข้อมูลนี้จะใช้งานได้โดยค่าเริ่มต้น กลุ่มที่ถูกจำกัดมีลำดับความสำคัญต่ำสุด (และมีข้อจำกัดสูงสุด) ในกลุ่มทั้งหมด กลุ่มตามลำดับความสำคัญจากสูงไปต่ำมีดังนี้
- ใช้งานอยู่: มีการใช้แอปอยู่ในขณะนี้หรือใช้เมื่อเร็วๆ นี้
- ชุดการทำงาน: แอปมีการใช้งานเป็นประจำ
- บ่อย: มีการใช้แอปบ่อย แต่ไม่ใช่ทุกวัน
- หายาก: ไม่ค่อยได้ใช้แอป
- จำกัด: แอปใช้ทรัพยากรระบบเป็นจำนวนมาก หรืออาจแสดงลักษณะการทำงานที่ไม่พึงประสงค์
ระบบจะพิจารณาพฤติกรรมของแอปนอกเหนือจากรูปแบบการใช้งานเพื่อ ตัดสินใจว่าจะนำแอปของคุณไปไว้ในที่เก็บข้อมูลที่ถูกจำกัดหรือไม่
แอปของคุณมีโอกาสน้อยที่จะถูกนำไปไว้ในที่เก็บข้อมูลที่ถูกจำกัดหากแอปใช้ ทรัพยากรของระบบอย่างมีความรับผิดชอบมากขึ้น นอกจากนี้ ระบบจะนำแอปของคุณไปไว้ในที่เก็บข้อมูลที่มีการจำกัดน้อยกว่า หากผู้ใช้โต้ตอบกับแอปของคุณโดยตรง
ตรวจสอบว่าแอปของคุณอยู่ในที่เก็บข้อมูลที่ถูกจำกัดหรือไม่
หากต้องการตรวจสอบว่าระบบได้นำแอปของคุณไปไว้ในที่เก็บข้อมูลที่ถูกจำกัดหรือไม่ ให้เรียกใช้
getAppStandbyBucket()
หากค่าที่ส่งคืนของเมธอดนี้คือ STANDBY_BUCKET_RESTRICTED
แสดงว่าแอปของคุณ
อยู่ในที่เก็บข้อมูลที่ถูกจำกัด
ทดสอบลักษณะการทำงานของที่เก็บข้อมูลที่ถูกจำกัด
หากต้องการทดสอบลักษณะการทำงานของแอปเมื่อระบบนำแอปไปไว้ในที่เก็บข้อมูลที่ถูกจำกัด คุณสามารถย้ายแอปไปยังที่เก็บข้อมูลดังกล่าวได้ด้วยตนเอง โดยเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล
adb shell am set-standby-bucket PACKAGE_NAME restricted
ตำแหน่งในเบื้องหน้าและโหมดประหยัดแบตเตอรี่
ตั้งแต่ Android 12 เป็นต้นไป ระบบจะยังคงส่งตำแหน่งที่ทำงานอยู่เบื้องหน้า (รวมถึงจาก บริการที่ทำงานอยู่เบื้องหน้า) ได้ในขณะที่โหมดประหยัดแบตเตอรี่ ทำงานอยู่ แม้ว่าหน้าจอจะปิดอยู่ก็ตาม
ก่อนหน้านี้ โหมดประหยัดแบตเตอรี่จะหยุดการอัปเดตตำแหน่งเมื่อปิดหน้าจอ การเปลี่ยนแปลงนี้จะช่วยให้ผู้ใช้มีอายุการใช้งานแบตเตอรี่ที่ดีขึ้น และหมายความว่านักพัฒนาแอปสามารถ หลีกเลี่ยงการขอให้ผู้ใช้ปิดโหมดประหยัดแบตเตอรี่เพื่อให้มั่นใจว่า จะมีการนำส่งตำแหน่ง
แอปที่ขอตำแหน่งผ่านบริการที่ทำงานอยู่เบื้องหน้าควรทำตามขั้นตอนต่อไปนี้
- โทรหา
getLocationPowerSaverMode()
เพื่อตรวจสอบลักษณะการทำงานของฟีเจอร์ตำแหน่งของอุปกรณ์เมื่อโหมดประหยัดแบตเตอรี่ทำงาน - หากฟังก์ชันนี้แสดงผลเป็น
LOCATION_MODE_FOREGROUND_ONLY
แอปของคุณจะยังคงได้รับการอัปเดตตำแหน่งขณะที่ทำงานอยู่เบื้องหน้าหรือเรียกใช้บริการที่ทำงานอยู่เบื้องหน้าในขณะที่โหมดประหยัดแบตเตอรี่เปิดอยู่และหน้าจอปิดอยู่
ความปลอดภัยและความเป็นส่วนตัว
ตำแหน่งโดยประมาณ
ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ผู้ใช้สามารถขอให้แอปของคุณมีสิทธิ์เข้าถึงข้อมูลตำแหน่งโดยประมาณเท่านั้น
หากแอปขอสิทธิ์รันไทม์
ACCESS_FINE_LOCATION
คุณควรขอสิทธิ์
ACCESS_COARSE_LOCATION
ด้วยเพื่อจัดการกรณีที่ผู้ใช้ให้สิทธิ์เข้าถึงตำแหน่งโดยประมาณ
แก่แอป คุณควรรวมสิทธิ์ทั้ง 2 รายการไว้ในคำขอรันไทม์เดียว
กล่องโต้ตอบสิทธิ์ของระบบจะมีตัวเลือกต่อไปนี้สำหรับผู้ใช้ ดังที่แสดงในรูปที่ 1
- แน่นอน: ให้สิทธิ์เข้าถึงข้อมูลตำแหน่งที่แน่นอน
- โดยประมาณ: ให้สิทธิ์เข้าถึงเฉพาะข้อมูลตำแหน่งโดยประมาณ
ปุ่มเปิด/ปิดไมโครโฟนและกล้อง
อุปกรณ์ที่รองรับซึ่งใช้ Android 12 ขึ้นไปจะอนุญาตให้ผู้ใช้ เปิดและปิดใช้สิทธิ์เข้าถึงกล้องและไมโครโฟนสำหรับทุกแอปในอุปกรณ์ได้โดย กดตัวเลือกปุ่มเปิด/ปิดเพียงปุ่มเดียว ผู้ใช้สามารถเข้าถึงตัวเลือกที่เปิด/ปิดได้จากการตั้งค่าด่วนตามที่แสดงใน รูปที่ 1 หรือจากหน้าจอความเป็นส่วนตัวในการตั้งค่าระบบ
ดูข้อมูลเพิ่มเติมเกี่ยวกับ
ปุ่มเปิด/ปิดเหล่านี้ และวิธีตรวจสอบ
ว่าแอปของคุณเป็นไปตามแนวทางปฏิบัติแนะนำเกี่ยวกับสิทธิ์
CAMERA
และ
RECORD_AUDIO
สัญญาณบอกสถานะไมโครโฟนและกล้อง
ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป เมื่อแอปเข้าถึง ไมโครโฟนหรือกล้องถ่ายรูป ไอคอนจะปรากฏในแถบสถานะ
ดูข้อมูลเพิ่มเติมเกี่ยวกับ
ตัวบ่งชี้เหล่านี้และวิธีตรวจสอบว่าแอปของคุณเป็นไปตามแนวทางปฏิบัติแนะนำเกี่ยวกับสิทธิ์
CAMERA
และ
RECORD_AUDIO
ระดับการเข้าถึงแพ็กเกจสิทธิ์
ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป แอปที่กำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไปและเรียกใช้เมธอดใดเมธอดหนึ่งต่อไปนี้จะได้รับชุดผลลัพธ์ที่กรองแล้วตามระดับการเข้าถึงแพ็กเกจของแอปไปยังแอปอื่นๆ
นำการติดตั้งใช้งาน BouncyCastle ออกแล้ว
Android 12 นำการใช้งาน BouncyCastle จำนวนมากของ อัลกอริทึมการเข้ารหัสที่เลิกใช้งานไปก่อนหน้านี้ออก ซึ่งรวมถึงอัลกอริทึม AES ทั้งหมด ระบบจะใช้การติดตั้งใช้งาน Conscrypt ของอัลกอริทึมเหล่านี้แทน
การเปลี่ยนแปลงนี้จะส่งผลต่อแอปของคุณหากเป็นไปตามเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้
- แอปของคุณใช้ขนาดคีย์ 512 บิต Conscrypt ไม่รองรับขนาดคีย์นี้ หากจำเป็น ให้อัปเดตตรรกะการเข้ารหัสของแอปเพื่อใช้ขนาดคีย์ที่แตกต่างกัน
แอปของคุณใช้ขนาดคีย์ที่ไม่ถูกต้องกับ
KeyGenerator
การติดตั้งใช้งานKeyGenerator
ของ Conscrypt จะทำการตรวจสอบเพิ่มเติม ในพารามิเตอร์คีย์ เมื่อเทียบกับ BouncyCastle ตัวอย่างเช่น Conscrypt ไม่อนุญาตให้แอปสร้างคีย์ AES 64 บิต เนื่องจาก AES รองรับเฉพาะคีย์ 128, 192 และ 256 บิตBouncyCastle อนุญาตให้สร้างคีย์ที่มีขนาดไม่ถูกต้องได้ แต่จะล้มเหลวในภายหลัง หากใช้คีย์เหล่านี้กับ
Cipher
Conscrypt จะล้มเหลวก่อนคุณเริ่มต้นไซเฟอร์โหมด Galois/Counter (GCM) โดยใช้ขนาดอื่น ที่ไม่ใช่ 12 ไบต์ การติดตั้งใช้งาน
GcmParameterSpec
ของ Conscrypt ต้องมีการ เริ่มต้น 12 ไบต์ ซึ่ง NIST แนะนำ
การแจ้งเตือนการเข้าถึงคลิปบอร์ด
ใน Android 12 ขึ้นไป เมื่อแอปเรียกใช้
getPrimaryClip()
เพื่อเข้าถึงข้อมูลคลิปจากแอปอื่น
เป็นครั้งแรก ข้อความ Toast จะแจ้งให้ผู้ใช้ทราบเกี่ยวกับการเข้าถึงคลิปบอร์ดนี้
ข้อความภายในข้อความป๊อปอัปมีรูปแบบต่อไปนี้
APP pasted from your clipboard.
ข้อมูลเกี่ยวกับข้อความในคำอธิบายคลิป
ใน Android 12 ขึ้นไป getPrimaryClipDescription()
จะ
ตรวจหาข้อมูลต่อไปนี้ได้
- ข้อความที่มีสไตล์โดยใช้
isStyledText()
- การจัดประเภทข้อความต่างๆ เช่น URL โดยใช้
getConfidenceScore()
แอปปิดกล่องโต้ตอบของระบบไม่ได้
เพื่อปรับปรุงการควบคุมของผู้ใช้เมื่อโต้ตอบกับแอปและระบบ เราจึงเลิกใช้งานการดำเนินการ Intent ของ
ACTION_CLOSE_SYSTEM_DIALOGS
ตั้งแต่ Android 12 เป็นต้นไป ยกเว้นกรณีพิเศษ
บางกรณี เมื่อแอปพยายามเรียกใช้
Intent ที่มีการดำเนินการนี้ ระบบจะดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้ตาม SDK เวอร์ชันเป้าหมายของแอป
- หากแอปกำหนดเป้าหมายเป็น Android 12 ขึ้นไป จะเกิด
SecurityException
หากแอปกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) หรือต่ำกว่า ระบบจะไม่ดำเนินการ Intent และข้อความต่อไปนี้จะปรากฏใน Logcat
E ActivityTaskManager Permission Denial: \ android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \ com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \ dropping broadcast.
ข้อยกเว้น
ในกรณีต่อไปนี้ แอปจะยังคงปิดกล่องโต้ตอบของระบบใน Android 12 ขึ้นไปได้
- แอปของคุณกำลังเรียกใช้การทดสอบ เครื่องมือ
แอปของคุณกำหนดเป้าหมายเป็น Android 11 หรือต่ำกว่า และแสดงหน้าต่าง ที่อยู่ด้านบนของลิ้นชักการแจ้งเตือน
แอปของคุณกำหนดเป้าหมายเป็น Android 11 หรือต่ำกว่า นอกจากนี้ ผู้ใช้ยังได้ โต้ตอบกับการแจ้งเตือน ซึ่งอาจใช้ปุ่มการดำเนินการของการแจ้งเตือน และแอปของคุณกำลัง ประมวลผลบริการหรือเครื่องรับการออกอากาศเพื่อตอบสนองต่อการดำเนินการของผู้ใช้
แอปของคุณกำหนดเป้าหมายเป็น Android 11 หรือต่ำกว่า และมีบริการการช่วยเหลือพิเศษที่ใช้งานอยู่ หากแอปของคุณกำหนดเป้าหมายเป็น Android 12 และต้องการปิดแถบการแจ้งเตือน ให้ใช้การดำเนินการเพื่อการช่วยเหลือพิเศษ
GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADE
แทน
ระบบจะบล็อกเหตุการณ์สัมผัสที่ไม่น่าเชื่อถือ
Android 12 จะป้องกันไม่ให้แอปใช้เหตุการณ์การแตะในกรณีที่การวางซ้อนบดบังแอปในลักษณะที่ไม่ปลอดภัย เพื่อรักษาความปลอดภัยของระบบและประสบการณ์การใช้งานที่ดี กล่าวคือ ระบบจะบล็อกการแตะที่ผ่านหน้าต่างบางบาน โดยมีข้อยกเว้นบางประการ
แอปที่ได้รับผลกระทบ
การเปลี่ยนแปลงนี้จะส่งผลต่อแอปที่เลือกอนุญาตให้การแตะผ่านหน้าต่างของแอป
เช่น การใช้แฟล็ก
FLAG_NOT_TOUCHABLE
ตัวอย่างบางส่วนรวมถึงแต่ไม่จำกัดเพียงรายการต่อไปนี้
- ภาพซ้อนทับที่ต้องใช้สิทธิ์
SYSTEM_ALERT_WINDOW
เช่น หน้าต่างที่ใช้TYPE_APPLICATION_OVERLAY
และใช้แฟล็กFLAG_NOT_TOUCHABLE
- หน้าต่างกิจกรรมที่ใช้
FLAG_NOT_TOUCHABLE
แฟล็ก
ข้อยกเว้น
ในกรณีต่อไปนี้ เราอนุญาตให้มีการแตะ "ส่งต่อ"
- การโต้ตอบภายในแอป แอปของคุณแสดงภาพซ้อนทับ และภาพซ้อนทับจะปรากฏเมื่อผู้ใช้โต้ตอบกับแอปของคุณเท่านั้น
หน้าต่างที่เชื่อถือได้ ช่วงเวลาเหล่านี้รวมถึง (แต่ไม่จำกัดเพียง) ช่วงเวลาต่อไปนี้
หน้าต่างที่ซ่อนอยู่ มุมมองรากของหน้าต่างคือ
GONE
หรือINVISIBLE
หน้าต่างโปร่งใสทั้งหมด พร็อพเพอร์ตี้
alpha
เป็น 0.0 สำหรับหน้าต่างหน้าต่างแจ้งเตือนของระบบที่มีความโปร่งแสงเพียงพอ ระบบจะพิจารณาว่าชุดหน้าต่างการแจ้งเตือนของระบบมีความโปร่งแสงเพียงพอเมื่อความทึบแสงรวมกันน้อยกว่าหรือเท่ากับความทึบแสงสูงสุดของระบบสำหรับการแตะ ใน Android 12 ความทึบสูงสุดนี้จะเป็น 0.8 โดยค่าเริ่มต้น
ตรวจหาเมื่อมีการบล็อกการแตะที่ไม่น่าเชื่อถือ
หากระบบบล็อกการแตะ Logcat จะบันทึกข้อความต่อไปนี้
Untrusted touch due to occlusion by PACKAGE_NAME
ทดสอบการเปลี่ยนแปลง
อุปกรณ์ที่ใช้ Android 12 ขึ้นไปจะบล็อกการแตะที่ไม่น่าเชื่อถือโดยค่าเริ่มต้น หากต้องการอนุญาตการแตะที่ไม่น่าเชื่อถือ ให้เรียกใช้คำสั่ง ADB ต่อไปนี้ในหน้าต่างเทอร์มินัล
# A specific app adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app # All apps # If you'd still like to see a Logcat message warning when a touch would be # blocked, use 1 instead of 0. adb shell settings put global block_untrusted_touches 0
หากต้องการเปลี่ยนลักษณะการทำงานกลับเป็นค่าเริ่มต้น (บล็อกการแตะที่ไม่น่าเชื่อถือ) ให้เรียกใช้คำสั่งต่อไปนี้
# A specific app adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app # All apps adb shell settings put global block_untrusted_touches 2
วงจรของกิจกรรม
ระบบจะไม่สิ้นสุดกิจกรรมตัวเรียกใช้รูทเมื่อกดปุ่มย้อนกลับอีกต่อไป
Android 12 เปลี่ยนการจัดการเริ่มต้นของการกดกลับของระบบในกิจกรรมของ Launcher ที่อยู่รูทของงาน ในเวอร์ชันก่อนหน้า ระบบ จะทำกิจกรรมเหล่านี้ให้เสร็จเมื่อกดปุ่มกลับ ใน Android 12 ตอนนี้ระบบจะย้าย กิจกรรมและงานของกิจกรรมนั้นไปไว้ที่เบื้องหลังแทนที่จะสิ้นสุดกิจกรรม ลักษณะการทำงานใหม่นี้จะตรงกับลักษณะการทำงานปัจจุบันเมื่อออกจากแอป โดยใช้ปุ่มหรือท่าทางสัมผัสหน้าแรก
สําหรับแอปส่วนใหญ่ การเปลี่ยนแปลงนี้หมายความว่าผู้ใช้ที่ใช้ปุ่มย้อนกลับเพื่อออกจากแอปของคุณจะกลับมาใช้แอปต่อจากสถานะอุ่นได้เร็วขึ้น แทนที่จะต้องรีสตาร์ทแอปใหม่ทั้งหมดจากสถานะเย็น
เราขอแนะนำให้ทดสอบแอปกับการเปลี่ยนแปลงนี้ หากปัจจุบันแอปของคุณลบล้าง
onBackPressed()
เพื่อจัดการ
การนำทางย้อนกลับและสิ้นสุด Activity
ให้อัปเดตการติดตั้งใช้งานเพื่อเรียก
ผ่านไปยัง super.onBackPressed()
แทนการสิ้นสุด การโทร
super.onBackPressed()
จะย้ายกิจกรรมและงานของกิจกรรมนั้นไปไว้ที่พื้นหลังเมื่อ
เหมาะสม และมอบประสบการณ์การนำทางที่สอดคล้องกันมากขึ้นแก่ผู้ใช้
ในแอปต่างๆ
นอกจากนี้ โปรดทราบว่าโดยทั่วไปเราขอแนะนำให้ใช้ AndroidX Activity API สำหรับ
การนำทางย้อนกลับที่กำหนดเอง
แทนการลบล้าง onBackPressed()
AndroidX Activity API
จะเลื่อนไปใช้ลักษณะการทำงานของระบบที่เหมาะสมโดยอัตโนมัติหากไม่มี
คอมโพเนนต์ใดๆ สกัดกั้นการกดปุ่มย้อนกลับของระบบ
กราฟิกและรูปภาพ
การสลับอัตราการรีเฟรชที่ปรับปรุงแล้ว
ใน Android 12 การเปลี่ยนแปลงอัตราการรีเฟรชโดยใช้
setFrameRate()
จะเกิดขึ้นได้ไม่ว่าจอแสดงผลจะรองรับการเปลี่ยนไปใช้อัตราการรีเฟรชใหม่
อย่างราบรื่นหรือไม่ก็ตาม การเปลี่ยนอย่างราบรื่นคือการเปลี่ยนที่ไม่มีการหยุดชะงัก
ทางภาพ เช่น หน้าจอสีดำเป็นเวลา 1-2 วินาที ก่อนหน้านี้ หากจอแสดงผลไม่รองรับการเปลี่ยนผ่านที่ราบรื่น จอแสดงผลมักจะใช้อัตรารีเฟรชเดิมต่อไปหลังจากเรียกใช้ setFrameRate()
คุณสามารถพิจารณาล่วงหน้าได้ว่าการเปลี่ยนไปใช้การรีเฟรชใหม่จะราบรื่นหรือไม่โดยการเรียกใช้ getAlternativeRefreshRates()
โดยทั่วไป ระบบจะเรียกใช้การเรียกกลับ onDisplayChanged()
หลังจากที่การสลับอัตราการรีเฟรชเสร็จสมบูรณ์ แต่สำหรับจอแสดงผลที่เชื่อมต่อภายนอกบางจอ
ระบบจะเรียกใช้การเรียกกลับในระหว่างการเปลี่ยนที่ราบรื่น
ตัวอย่างวิธีติดตั้งใช้งานมีดังนี้
Kotlin
// Determine whether the transition will be seamless. // Non-seamless transitions may cause a 1-2 second black screen. val refreshRates = this.display?.mode?.alternativeRefreshRates val willBeSeamless = Arrays.asList<FloatArray>(refreshRates).contains(newRefreshRate) // Set the frame rate even if the transition will not be seamless. surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
Java
// Determine whether the transition will be seamless. // Non-seamless transitions may cause a 1-2 second black screen. Display display = context.getDisplay(); // API 30+ Display.Mode mode = display.getMode(); float[] refreshRates = mode.getAlternativeRefreshRates(); boolean willBeSeamless = Arrays.asList(refreshRates).contains(newRefreshRate); // Set the frame rate even if the transition will not be seamless. surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS);
การเชื่อมต่อ
การอัปเดต Passpoint
Android 12 มีการเพิ่ม API ต่อไปนี้
isPasspointTermsAndConditionsSupported()
: ข้อกำหนดและเงื่อนไขเป็นฟีเจอร์ Passpoint ที่ช่วยให้การติดตั้งใช้งานเครือข่ายสามารถแทนที่แคพทีฟพอร์ทัลที่ไม่ปลอดภัย ซึ่งใช้เครือข่ายแบบเปิดด้วยเครือข่าย Passpoint ที่ปลอดภัย ระบบจะแสดงการแจ้งเตือนต่อผู้ใช้เมื่อต้องยอมรับข้อกำหนดและเงื่อนไข แอปที่แนะนำเครือข่าย Passpoint ซึ่งมีข้อกำหนดและเงื่อนไข ต้องเรียกใช้ API นี้ก่อนเพื่อให้แน่ใจว่าอุปกรณ์รองรับความสามารถดังกล่าว หากอุปกรณ์ไม่รองรับความสามารถดังกล่าว ก็จะเชื่อมต่อกับเครือข่ายนี้ไม่ได้ และต้องแนะนำเครือข่ายอื่นหรือเครือข่ายเดิมisDecoratedIdentitySupported()
: เมื่อตรวจสอบสิทธิ์ในเครือข่ายที่มีการตกแต่งคำนำหน้า คำนำหน้าที่ตกแต่งแล้ว จะช่วยให้ผู้ให้บริการเครือข่ายอัปเดตตัวระบุการเข้าถึงเครือข่าย (NAI) เพื่อทำการกำหนดเส้นทางที่ชัดเจนผ่านพร็อกซีหลายรายการภายใน เครือข่าย AAA (ดูข้อมูลเพิ่มเติมได้ที่ RFC 7542)Android 12 ใช้ฟีเจอร์นี้เพื่อให้เป็นไปตามข้อกำหนดของ WBA สำหรับ ส่วนขยาย PPS-MO แอปที่แนะนำเครือข่าย Passpoint ซึ่งต้องมีข้อมูลประจำตัวที่ตกแต่งแล้วจะต้องเรียกใช้ API นี้ก่อนเพื่อให้แน่ใจว่าอุปกรณ์รองรับความสามารถดังกล่าว หาก อุปกรณ์ไม่รองรับความสามารถนี้ ระบบจะไม่ตกแต่งข้อมูลประจำตัว และการตรวจสอบสิทธิ์ในเครือข่ายอาจล้มเหลว
หากต้องการสร้างคำแนะนำ Passpoint แอปต้องใช้คลาส
PasspointConfiguration
Credential
และ
HomeSp
คลาสเหล่านี้อธิบายโปรไฟล์ Passpoint ซึ่งกำหนดไว้ในข้อกำหนด Passpoint ของ Wi-Fi Alliance
ดูข้อมูลเพิ่มเติมได้ที่ Wi-Fi Suggestion API สำหรับการเชื่อมต่ออินเทอร์เน็ต
ข้อจำกัดที่อัปเดตแล้วเกี่ยวกับอินเทอร์เฟซที่ไม่ได้อยู่ใน SDK
Android 12 มีรายการอินเทอร์เฟซที่ไม่ใช่ SDK ที่ถูกจำกัดซึ่งอัปเดตแล้ว โดยอิงตามการทำงานร่วมกับนักพัฒนาแอป Android และการทดสอบภายในล่าสุด เราจะตรวจสอบว่ามีทางเลือกสาธารณะ พร้อมใช้งานก่อนที่จะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ทุกครั้งที่ทำได้
หากแอปไม่ได้กำหนดเป้าหมายเป็น Android 12 การเปลี่ยนแปลงบางอย่างเหล่านี้ อาจไม่มีผลกับคุณในทันที อย่างไรก็ตาม แม้ว่าปัจจุบันคุณจะใช้ อินเทอร์เฟซที่ไม่ใช่ SDK บางรายการได้ (ขึ้นอยู่กับระดับ API เป้าหมายของแอป) แต่การใช้วิธีการหรือฟิลด์ที่ไม่ใช่ SDK ใดๆ ก็ยังคงมีความเสี่ยงสูงที่จะทำให้แอป ขัดข้อง
หากไม่แน่ใจว่าแอปใช้อินเทอร์เฟซที่ไม่ใช่ SDK หรือไม่ คุณสามารถทดสอบแอป เพื่อดูได้ หากแอปของคุณใช้อินเทอร์เฟซที่ไม่ใช่ SDK คุณควรเริ่มวางแผน การย้ายข้อมูลไปยังทางเลือกอื่นของ SDK อย่างไรก็ตาม เราเข้าใจว่าแอปบางแอปมี Use Case ที่ถูกต้องสำหรับการใช้อินเทอร์เฟซที่ไม่ใช่ SDK หากไม่พบวิธีอื่นแทนการใช้อินเทอร์เฟซที่ไม่ใช่ SDK สำหรับฟีเจอร์ในแอป คุณควรขอ API สาธารณะใหม่
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงใน Android เวอร์ชันนี้ได้ที่การอัปเดต ข้อจํากัดของอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 12 ดูข้อมูลเพิ่มเติม เกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK โดยทั่วไปได้ที่ข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK