แพลตฟอร์ม Android 12 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้มีผลกับแอปทั้งหมดเมื่อทำงานบน Android 12 โดยไม่คำนึงถึง targetSdkVersion
คุณควรทดสอบแอปแล้วแก้ไขตามความจำเป็นเพื่อรองรับฟีเจอร์เหล่านี้อย่างเหมาะสม หากมี
โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่ส่งผลต่อแอปที่กําหนดเป้าหมายเป็น Android 12 เท่านั้นด้วย
ประสบการณ์ของผู้ใช้
เอฟเฟกต์การยืดเมื่อเลื่อนผ่าน
ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ลักษณะที่ปรากฏของเหตุการณ์การเลื่อนผ่านจะเปลี่ยนไป
ใน Android 11 และต่ำกว่า เหตุการณ์การเลื่อนเกินจะทำให้องค์ประกอบภาพเรืองแสง ส่วนใน Android 12 ขึ้นไป องค์ประกอบภาพจะยืดออกและเด้งกลับในเหตุการณ์การลาก และจะเด้งกลับในเหตุการณ์การแตะแล้วปัด
ดูข้อมูลเพิ่มเติมได้ที่คู่มือการทำท่าทางสัมผัสในการเลื่อนแบบเคลื่อนไหว
หน้าจอเริ่มต้น (Splash Screen) ของแอป
หากก่อนหน้านี้คุณใช้หน้าจอแนะนำที่กําหนดเองใน Android 11 หรือต่ำกว่า คุณจะต้องย้ายข้อมูลแอปไปยัง SplashScreen
API เพื่อให้แอปแสดงอย่างถูกต้องตั้งแต่ Android 12 เป็นต้นไป การไม่ย้ายข้อมูลแอปจะทำให้ประสบการณ์การเปิดแอปลดลงหรือไม่ได้ตั้งใจ
โปรดดูวิธีการที่หัวข้อย้ายข้อมูลการใช้งานหน้าจอแนะนำที่มีอยู่ไปยัง Android 12
นอกจากนี้ ตั้งแต่ Android 12 เป็นต้นไป ระบบจะใช้หน้าจอเริ่มต้นใหม่ของ Android ที่เป็นค่าเริ่มต้นของระบบในการเริ่มต้นแบบ Cold และการเริ่มต้นแบบ Warm สำหรับแอปทั้งหมดเสมอ
โดยค่าเริ่มต้น ระบบจะสร้างหน้าจอแนะนำเริ่มต้นนี้โดยใช้องค์ประกอบไอคอนตัวเปิดของแอปและ windowBackground
ของธีม (หากเป็นสีเดียว)
ดูรายละเอียดเพิ่มเติมได้ที่คู่มือนักพัฒนาซอฟต์แวร์สำหรับหน้าจอแนะนำ
การแก้ไขความตั้งใจในเว็บ
ตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป อินเทนต์ของเว็บทั่วไปจะแก้ไขเป็นกิจกรรมในแอปก็ต่อเมื่อแอปได้รับอนุมัติสำหรับโดเมนที่เฉพาะเจาะจงซึ่งอยู่ในอินเทนต์ของเว็บนั้น หากแอปไม่ได้รับอนุมัติสำหรับโดเมนนั้น อินเทนต์ของเว็บจะแก้ไขไปยังแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน
แอปจะได้รับอนุมัตินี้โดยดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
ยืนยันโดเมนโดยใช้ลิงก์แอป Android
ในแอปที่กำหนดเป้าหมายเป็น Android 12 ขึ้นไป ระบบจะเปลี่ยนวิธียืนยัน Android App Link ของแอปโดยอัตโนมัติ ในตัวกรอง Intent ของแอป ให้ตรวจสอบว่าคุณได้รวมหมวดหมู่
BROWSABLE
และรองรับรูปแบบhttps
ใน Android 12 ขึ้นไป คุณสามารถยืนยัน App Link ของ Android ด้วยตนเองเพื่อทดสอบว่าตรรกะที่ได้รับการอัปเดตนี้ส่งผลต่อแอปของคุณอย่างไร
ขอให้ผู้ใช้เชื่อมโยงแอปกับโดเมนในการตั้งค่าระบบ
หากแอปเรียกใช้ Intent ของเว็บ ให้พิจารณาเพิ่มข้อความแจ้งหรือกล่องโต้ตอบที่ขอให้ผู้ใช้ยืนยันการดำเนินการ
การปรับปรุงโหมดสมจริงสำหรับการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัส
Android 12 รวมลักษณะการทำงานที่มีอยู่เข้าด้วยกันเพื่อให้ผู้ใช้ใช้คำสั่งการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสขณะอยู่ในโหมดสมจริงได้ง่ายขึ้น นอกจากนี้ Android 12 ยังมีลักษณะการทำงานแบบย้อนหลังสำหรับโหมดการแชร์หน้าจอแบบติดแน่น
Display#getRealSize และ getRealMetrics: การเลิกใช้งานและข้อจํากัด
อุปกรณ์ Android มีรูปแบบที่หลากหลาย เช่น หน้าจอขนาดใหญ่ แท็บเล็ต และอุปกรณ์แบบพับได้ แอปของคุณต้องระบุขนาดหน้าจอหรือการแสดงผลเพื่อแสดงผลเนื้อหาอย่างเหมาะสมสำหรับอุปกรณ์แต่ละเครื่อง เมื่อเวลาผ่านไป Android ได้ให้บริการ API ต่างๆ สำหรับการดึงข้อมูลนี้ ใน Android 11 เราได้เปิดตัว WindowMetrics
API และเลิกใช้งานเมธอดต่อไปนี้
ใน Android 12 เรายังคงขอแนะนำให้ใช้ WindowMetrics
และกำลังจะเลิกใช้งานวิธีการต่อไปนี้
Android 12 จะจำกัดค่าที่ API แสดงผลสำหรับแอปที่ปรับขนาดได้เพียงบางส่วน เพื่อลดลักษณะการทำงานของแอปพลิเคชันที่ใช้ Display API เพื่อดึงข้อมูลขอบเขตของแอปพลิเคชัน ซึ่งอาจส่งผลกระทบต่อแอปที่ใช้ข้อมูลนี้กับ MediaProjection
แอปควรใช้ WindowMetrics
API เพื่อค้นหาขอบเขตของหน้าต่าง และ Configuration.densityDpi
เพื่อค้นหาความหนาแน่นปัจจุบัน
หากต้องการให้เข้ากันได้กับ Android เวอร์ชันเก่าๆ มากขึ้น คุณสามารถใช้ไลบรารี WindowManager
ของ Jetpack ซึ่งมีคลาส 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) ได้เปิดตัวที่เก็บข้อมูลที่มีข้อจำกัดเป็นที่เก็บข้อมูลโหมดสแตนด์บายของแอป ตั้งแต่ Android 12 เป็นต้นไป ที่เก็บข้อมูลนี้จะเปิดใช้งานโดยค่าเริ่มต้น ส่วนถังที่จำกัดจะมีลำดับความสำคัญต่ำสุด (และข้อจำกัดสูงสุด) ของถังทั้งหมด กลุ่มตามลําดับความสําคัญจากสูงไปต่ำมีดังนี้
- ใช้งานอยู่: มีการใช้แอปอยู่ในขณะนี้หรือเพิ่งมีการใช้
- ชุดที่ใช้งานได้: แอปมีการใช้งานอยู่เป็นประจำ
- บ่อย: ใช้แอปบ่อย แต่ไม่ใช่ทุกวัน
- นานๆ ครั้ง: แอปไม่ได้ใช้บ่อย
- จำกัด: แอปใช้ทรัพยากรระบบเป็นจำนวนมากหรืออาจแสดงลักษณะการทำงานที่ไม่พึงประสงค์
ระบบจะพิจารณาลักษณะการทํางานของแอปนอกเหนือจากรูปแบบการใช้งานเพื่อตัดสินว่าจะนําแอปของคุณไปไว้ในที่เก็บข้อมูลที่ถูกจํากัดหรือไม่
แอปของคุณมีแนวโน้มที่จะไม่ถูกจัดให้อยู่ในที่เก็บข้อมูลที่ถูกจํากัดหากใช้ทรัพยากรของระบบอย่างมีความรับผิดชอบมากขึ้น นอกจากนี้ ระบบจะจัดแอปของคุณไว้ในที่เก็บข้อมูลที่มีข้อจำกัดน้อยลงหากผู้ใช้โต้ตอบกับแอปโดยตรง
ตรวจสอบว่าแอปของคุณอยู่ในที่เก็บข้อมูลที่ถูกจํากัดหรือไม่
หากต้องการตรวจสอบว่าระบบได้จัดเก็บแอปของคุณไว้ในที่เก็บข้อมูลที่ถูกจํากัดหรือไม่ ให้เรียกใช้ getAppStandbyBucket()
หากผลลัพธ์ของเมธอดนี้คือ STANDBY_BUCKET_RESTRICTED
แสดงว่าแอปของคุณอยู่ในที่เก็บข้อมูลที่ถูกจํากัด
ทดสอบลักษณะการทํางานของที่เก็บข้อมูลที่ถูกจํากัด
หากต้องการทดสอบลักษณะการทำงานของแอปเมื่อระบบนำแอปไปไว้ในที่เก็บข้อมูลที่ถูกจำกัด คุณสามารถย้ายแอปไปยังที่เก็บข้อมูลดังกล่าวด้วยตนเอง ซึ่งทำได้โดยการเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล
adb shell am set-standby-bucket PACKAGE_NAME restricted
ความปลอดภัยและความเป็นส่วนตัว
ตำแหน่งโดยประมาณ
ในอุปกรณ์ที่ใช้ 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 Mode (GCM) โดยใช้ขนาดที่ไม่ใช่ 12 ไบต์ การติดตั้งใช้งาน
GcmParameterSpec
ของ Conscrypt ต้องมีการเริ่มต้น 12 ไบต์ตามที่ NIST แนะนำ
การแจ้งเตือนการเข้าถึงคลิปบอร์ด
ใน Android 12 ขึ้นไป เมื่อแอปเรียกใช้ getPrimaryClip()
เพื่อเข้าถึงข้อมูลคลิปจากแอปอื่นเป็นครั้งแรก ระบบจะแสดงข้อความแจ้งเตือนการเข้าถึงคลิปบอร์ดนี้แก่ผู้ใช้
ข้อความภายในข้อความแบบแสดงข้อมูลเป็นแถบสั้นๆ มีรูปแบบดังนี้
APP pasted from your clipboard.
ข้อมูลเกี่ยวกับข้อความในคำอธิบายคลิป
ใน Android 12 ขึ้นไป getPrimaryClipDescription()
จะตรวจหารายละเอียดต่อไปนี้ได้
- ข้อความที่มีการจัดรูปแบบโดยใช้
isStyledText()
- การแยกประเภทข้อความที่แตกต่างกัน เช่น URL โดยใช้
getConfidenceScore()
แอปปิดกล่องโต้ตอบของระบบไม่ได้
เราเลิกใช้งานการดำเนินการตาม Intent ของ Android 12 เพื่อปรับปรุงการควบคุมของผู้ใช้เมื่อโต้ตอบกับแอปและระบบACTION_CLOSE_SYSTEM_DIALOGS
ยกเว้นกรณีพิเศษบางกรณี เมื่อแอปพยายามเรียกใช้ 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 FLAG_NOT_TOUCHABLE
ตัวอย่างบางส่วนรวมถึงแต่ไม่จํากัดเพียงรายการต่อไปนี้
- การวางซ้อนที่ต้องใช้สิทธิ์
SYSTEM_ALERT_WINDOW
เช่น หน้าต่างที่ใช้TYPE_APPLICATION_OVERLAY
และใช้ FlagFLAG_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 เปลี่ยนการจัดการเริ่มต้นของการกดแป้น Back ของระบบในกิจกรรมของ Launcher ที่เป็นต้นทางของงาน ในเวอร์ชันก่อนหน้านี้ ระบบจะดำเนินการเหล่านี้ให้เสร็จสิ้นเมื่อกดแป้น Back ใน Android 12 ตอนนี้ระบบจะย้ายกิจกรรมและงานของกิจกรรมไปยังเบื้องหลังแทนที่จะทำกิจกรรมให้เสร็จ ลักษณะการทำงานใหม่นี้ตรงกับลักษณะการทำงานปัจจุบันเมื่อออกจากแอปโดยใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส
สําหรับแอปส่วนใหญ่ การเปลี่ยนแปลงนี้หมายความว่าผู้ใช้ที่ใช้ปุ่มย้อนกลับเพื่อออกจากแอปจะกลับมาใช้งานแอปจากสถานะอุ่นได้เร็วขึ้น แทนที่จะต้องรีสตาร์ทแอปจากสถานะเย็นโดยสมบูรณ์
เราขอแนะนำให้ทดสอบแอปด้วยการเปลี่ยนแปลงนี้ หากปัจจุบันแอปของคุณลบล้าง onBackPressed()
เพื่อจัดการการนําทางกลับและดำเนินการ Activity
ให้เสร็จสิ้น ให้อัปเดตการใช้งานเพื่อเรียกใช้ super.onBackPressed()
แทนการเสร็จสิ้น การเรียกใช้super.onBackPressed()
จะย้ายกิจกรรมและงานของกิจกรรมไปยังเบื้องหลังเมื่อเหมาะสม และมอบประสบการณ์การไปยังส่วนต่างๆ ที่สอดคล้องกันมากขึ้นให้แก่ผู้ใช้ในแอปต่างๆ
นอกจากนี้ โปรดทราบว่าโดยทั่วไปเราขอแนะนำให้ใช้ AndroidX Activity API เพื่อระบุการนําทางกลับที่กําหนดเองแทนการลบล้าง onBackPressed()
AndroidX Activity API จะเปลี่ยนเป็นลักษณะการทํางานของระบบที่เหมาะสมโดยอัตโนมัติหากไม่มีคอมโพเนนต์ที่ขัดจังหวะการกดแป้น Back ของระบบ
กราฟิกและรูปภาพ
ปรับปรุงการสลับอัตราการรีเฟรช
ใน 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
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 ซึ่งระบุไว้ในข้อกำหนดของ Wi-Fi Alliance สำหรับ Passpoint
ดูข้อมูลเพิ่มเติมได้ที่ 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