แพลตฟอร์ม Android 12 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้จะมีผลกับแอปทั้งหมดเมื่อทำงานใน Android 12 โดยไม่คำนึงถึง targetSdkVersion คุณควรทดสอบแอปแล้วแก้ไขตามความจำเป็นเพื่อรองรับสิ่งเหล่านี้อย่างเหมาะสม (หากมี)
อย่าลืมตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลกับแอปที่กำหนดเป้าหมายเป็น Android 12 เท่านั้นด้วย
ประสบการณ์ของผู้ใช้
เอฟเฟกต์การยืดเมื่อเลื่อนเกิน
ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ลักษณะการทำงานของภาพสำหรับเหตุการณ์การเลื่อนเกินจะเปลี่ยนไป
ใน Android 11 และต่ำกว่า เหตุการณ์การเลื่อนเกินจะทำให้องค์ประกอบภาพมีแสงเรือง ใน Android 12 ขึ้นไป องค์ประกอบภาพจะยืดและเด้งกลับเมื่อเกิดเหตุการณ์การลาก และจะเหวี่ยงและเด้งกลับเมื่อเกิดเหตุการณ์การเหวี่ยง
ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับการสร้างภาพเคลื่อนไหวสำหรับท่าทางสัมผัสการเลื่อน
หน้าจอเริ่มต้น (Splash Screen) ของแอป
หากคุณเคยติดตั้งใช้งานหน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองใน Android 11 หรือต่ำกว่า คุณจะต้องย้ายข้อมูลแอปไปยัง SplashScreen API เพื่อให้มั่นใจว่าแอปจะแสดงอย่างถูกต้องตั้งแต่ Android 12 เป็นต้นไป การไม่ย้ายข้อมูลแอปจะส่งผลให้ประสบการณ์การเปิดแอปมีประสิทธิภาพลดลงหรือไม่เป็นไปตามที่คาดไว้
ดูวิธีการได้ที่ย้ายข้อมูลการติดตั้งใช้งานหน้าจอเริ่มต้น (Splash Screen) ที่มีอยู่ไปยัง Android 12
นอกจากนี้ ตั้งแต่ Android 12 เป็นต้นไป ระบบจะใช้หน้าจอเริ่มต้น (Splash Screen) ค่าเริ่มต้นของระบบ Android เสมอเมื่อเริ่มทำงานแบบ Cold และเริ่มทำงานแบบ Warm สำหรับแอปทั้งหมด
โดยค่าเริ่มต้น หน้าจอเริ่มต้น (Splash Screen) ค่าเริ่มต้นของระบบนี้จะสร้างขึ้นโดยใช้องค์ประกอบไอคอน Launcher ของแอปและ windowBackground ของธีม (หากเป็นสีเดียว)
ดูรายละเอียดเพิ่มเติมได้ที่คู่มือนักพัฒนาซอฟต์แวร์เกี่ยวกับหน้าจอเริ่มต้น (Splash Screen)
การแก้ไข Intent ของเว็บ
ตั้งแต่ Android 12 (ระดับ API 31) เป็นต้นไป Intent ของเว็บทั่วไปจะเปลี่ยนเป็นกิจกรรมในแอปก็ต่อเมื่อแอปของคุณได้รับอนุมัติสำหรับโดเมนที่เฉพาะเจาะจงซึ่งมีอยู่ใน Intent ของเว็บนั้น หากแอปไม่ได้รับอนุมัติสำหรับโดเมนนั้น ระบบจะเปลี่ยนเส้นทาง Intent ของเว็บไปยังแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน
แอปจะได้รับการอนุมัตินี้โดยทำอย่างใดอย่างหนึ่งต่อไปนี้
ยืนยันโดเมนโดยใช้ Android App Links
ในแอปที่กำหนดเป้าหมายเป็น Android 12 ขึ้นไป ระบบจะเปลี่ยนวิธียืนยันโดยอัตโนมัติสำหรับ Android App Link ของแอป ในตัวกรอง Intent ของแอป ให้ตรวจสอบว่าคุณได้รวมหมวดหมู่
BROWSABLEและรองรับรูปแบบhttpsใน Android 12 ขึ้นไป คุณสามารถยืนยัน Android App Link ของแอปด้วยตนเองเพื่อทดสอบว่าตรรกะที่อัปเดตนี้ส่งผลต่อแอปอย่างไร
ขอให้ผู้ใช้เชื่อมโยงแอปของคุณกับโดเมนในการตั้งค่าระบบ
หากแอปเรียกใช้ Intent ของเว็บ ให้พิจารณาเพิ่มข้อความแจ้งหรือกล่องโต้ตอบที่ขอให้ผู้ใช้ยืนยันการดำเนินการ
การปรับปรุงโหมดใหญ่พิเศษสำหรับการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัส
Android 12 รวมลักษณะการทำงานที่มีอยู่เพื่อให้ผู้ใช้ใช้คำสั่งการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสได้ง่ายขึ้นขณะอยู่ในโหมดใหญ่พิเศษ นอกจากนี้ Android 12 ยังมีลักษณะการทำงานที่เข้ากันได้แบบย้อนหลังสำหรับโหมดใหญ่พิเศษแบบติดหนึบด้วย
Display#getRealSize และ getRealMetrics: การเลิกใช้งานและข้อจำกัด
อุปกรณ์ Android มีรูปแบบที่หลากหลาย เช่น หน้าจอขนาดใหญ่ แท็บเล็ต และอุปกรณ์แบบพับได้ แอปของคุณต้องกำหนดขนาดหน้าจอหรือจอแสดงผลเพื่อแสดงผลเนื้อหาให้เหมาะสมกับอุปกรณ์แต่ละเครื่อง เมื่อเวลาผ่านไป Android ได้จัดเตรียม API ต่างๆ สำหรับการดึงข้อมูลนี้ ใน Android 11 เราได้เปิดตัว API WindowMetrics และเลิกใช้งานเมธอดต่อไปนี้
ใน 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 วินาที โดยมีข้อยกเว้นบางประการ เพื่อมอบประสบการณ์การใช้งานที่ราบรื่นสำหรับบริการที่ทำงานอยู่เบื้องหน้าในระยะเวลาสั้นๆ การเปลี่ยนแปลงนี้ช่วยให้งานที่ใช้เวลาสั้นๆ มีโอกาสเสร็จสมบูรณ์ก่อนที่การแจ้งเตือนจะปรากฏขึ้น
ประสิทธิภาพ
Bucket สแตนด์บายแอปที่ถูกจำกัด
Android 11 (API ระดับ 30) เปิดตัวที่เก็บข้อมูลแบบจำกัดเป็นที่เก็บข้อมูลสแตนด์บายแอป ตั้งแต่ Android 12 เป็นต้นไป บัケットนี้จะทำงานโดยค่าเริ่มต้น ที่เก็บข้อมูลแบบจำกัดมีลำดับความสำคัญต่ำสุด (และมีข้อจำกัดสูงสุด) ในบรรดาที่เก็บข้อมูลทั้งหมด กลุ่มตามลำดับความสำคัญจากสูงไปต่ำมีดังนี้
- ใช้งานอยู่: มีการใช้งานแอปอยู่หรือเพิ่งมีการใช้งานเมื่อเร็วๆ นี้
- ชุดการทำงาน: แอปมีการใช้งานเป็นประจำ
- บ่อย: มีการใช้แอปบ่อย แต่ไม่ได้ใช้ทุกวัน
- Rare: แอปที่ใช้ไม่บ่อย
- ถูกจำกัด: แอปใช้ทรัพยากรระบบจำนวนมาก หรืออาจแสดงลักษณะการทำงานที่ไม่พึงประสงค์
ระบบจะพิจารณาพฤติกรรมของแอป นอกเหนือจากรูปแบบการใช้งาน เพื่อตัดสินใจว่าจะนำแอปของคุณไปไว้ในที่เก็บข้อมูลที่ถูกจำกัดหรือไม่
แอปของคุณมีแนวโน้มที่จะถูกจัดให้อยู่ในที่เก็บข้อมูลที่ถูกจำกัดน้อยลงหากแอปใช้ทรัพยากรระบบอย่างมีความรับผิดชอบมากขึ้น นอกจากนี้ ระบบจะนำแอปของคุณไปไว้ในที่เก็บที่มีข้อจำกัดน้อยกว่าหากผู้ใช้โต้ตอบกับแอปโดยตรง
ตรวจสอบว่าแอปอยู่ในที่เก็บข้อมูลที่ถูกจำกัดหรือไม่
หากต้องการตรวจสอบว่าระบบได้นำแอปของคุณไปไว้ใน Bucket ที่ถูกจำกัดหรือไม่ ให้เรียกใช้ 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 อนุญาตให้สร้างคีย์ที่มีขนาดไม่ถูกต้อง แต่จะดำเนินการไม่สำเร็จในภายหลังหากใช้คีย์เหล่านี้กับ
CipherConscrypt ล้มเหลวก่อนหน้านี้คุณเริ่มต้นการเข้ารหัส Galois/Counter Mode (GCM) โดยใช้ขนาดอื่นที่ไม่ใช่ 12 ไบต์ การติดตั้งใช้งาน
GcmParameterSpecของ Conscrypt ต้องใช้การเริ่มต้น 12 ไบต์ตามที่ NIST แนะนำ
การแจ้งเตือนการเข้าถึงคลิปบอร์ด
ใน Android 12 ขึ้นไป เมื่อแอปเรียกใช้
getPrimaryClip()
เพื่อเข้าถึงข้อมูลคลิปจากแอปอื่นเป็นครั้งแรก ข้อความโทสต์จะแจ้งให้ผู้ใช้ทราบถึงการเข้าถึงคลิปบอร์ดนี้
ข้อความภายในข้อความโทสต์จะมีรูปแบบดังนี้
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 หรือต่ำกว่า นอกจากนี้ ผู้ใช้ยังได้โต้ตอบกับการแจ้งเตือน ซึ่งอาจใช้ปุ่มดำเนินการของการแจ้งเตือน และแอปของคุณกำลังประมวลผลบริการหรือ Broadcast Receiver เพื่อตอบสนองต่อการดำเนินการของผู้ใช้รายนั้น
แอปของคุณกำหนดเป้าหมายเป็น 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
วงจรกิจกรรม
กิจกรรม Launcher ระดับรูทจะไม่สิ้นสุดอีกต่อไปเมื่อกดปุ่มย้อนกลับ
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()
โดยทั่วไป ระบบจะเรียกใช้ Callback onDisplayChanged() หลังจากเปลี่ยนอัตราการรีเฟรชเสร็จสมบูรณ์ แต่สำหรับจอแสดงผลที่เชื่อมต่อภายนอกบางจอ ระบบจะเรียกใช้ Callback ในระหว่างการเปลี่ยนที่ไม่ราบรื่น
ตัวอย่างวิธีที่คุณอาจนำไปใช้มีดังนี้
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
ระบบจะเพิ่ม API ต่อไปนี้ใน Android 12
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