การเปลี่ยนแปลงลักษณะการทํางาน: แอปทั้งหมด

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

นอกจากนี้ อย่าลืมตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลต่อแอปที่กำหนดเป้าหมายเป็น Android 12 เท่านั้น

ประสบการณ์ของผู้ใช้

เอฟเฟกต์การเลื่อนไปจนสุด

ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ลักษณะการแสดงผลของเหตุการณ์การเลื่อนผ่านจะเปลี่ยนไป

ใน Android 11 และต่ำกว่า เหตุการณ์การเลื่อนเกินจะทำให้องค์ประกอบภาพเรืองแสง ส่วนใน Android 12 ขึ้นไป องค์ประกอบภาพจะยืดออกและเด้งกลับในเหตุการณ์การลาก และจะเด้งกลับในเหตุการณ์การแตะแล้วปัด

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

หน้าจอแนะนำแอป

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

โปรดดูวิธีการที่หัวข้อย้ายข้อมูลการใช้งานหน้าจอแนะนำที่มีอยู่ไปยัง Android 12

นอกจากนี้ ตั้งแต่ Android 12 เป็นต้นไป ระบบจะนำหน้าจอแนะนําเริ่มต้นของระบบ Android ใหม่ไปใช้กับ โหมด Cold และ อุ่นเครื่องสําหรับทุกแอปเสมอ โดยค่าเริ่มต้น หน้าจอแนะนําเริ่มต้นของระบบนี้จะสร้างขึ้นโดยใช้องค์ประกอบไอคอน Launcher ของแอปและ windowBackground ของธีม (หากมีสีเดียว)

ดูรายละเอียดเพิ่มเติมได้ที่คู่มือนักพัฒนาซอฟต์แวร์สำหรับหน้าจอแนะนำ

การแก้ปัญหา Intent บนเว็บ

ตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป Intent ทั่วไปบนเว็บจะเปลี่ยนเป็นกิจกรรมในแอปก็ต่อเมื่อแอปได้รับอนุมัติสำหรับโดเมนที่เจาะจงซึ่งมี Intent ในเว็บดังกล่าวแล้ว หากแอปไม่ได้รับอนุมัติสำหรับโดเมนนั้น ผู้ใช้จะไปยังแอปเบราว์เซอร์เริ่มต้นแทน

แอปจะได้รับการอนุมัตินี้ได้โดยดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

หากแอปเรียกใช้ Web Intents ให้พิจารณาเพิ่มพรอมต์หรือกล่องโต้ตอบที่ขอให้ผู้ใช้ยืนยันการดำเนินการ

การปรับปรุงโหมดสมจริงสำหรับการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัส

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

Display#getRealSize และ getRealMetrics: การเลิกใช้งานและข้อจำกัด

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

ใน Android 12 เรายังคงแนะนำให้ใช้ WindowMetrics ต่อไป และจะเลิกใช้งานวิธีการเหล่านี้

Android 12 จะจำกัดค่าที่ API แสดงผลสำหรับแอปที่ปรับขนาดได้เพียงบางส่วน เพื่อลดลักษณะการทำงานของแอปพลิเคชันที่ใช้ Display 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) เปิดตัวที่เก็บข้อมูลที่จำกัดเป็นที่เก็บข้อมูลสแตนด์บายแอป ตั้งแต่ Android 12 เป็นต้นไป ที่เก็บข้อมูลนี้จะทำงานโดยค่าเริ่มต้น ส่วนถังที่จำกัดจะมีลำดับความสำคัญต่ำสุด (และข้อจำกัดสูงสุด) ของถังทั้งหมด โดยเรียงลำดับตามลำดับความสำคัญจากสูงไปต่ำมีดังนี้

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

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

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

ตรวจสอบว่าแอปของคุณอยู่ในที่เก็บข้อมูลที่ถูกจํากัดหรือไม่

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

ทดสอบลักษณะการทำงานของที่เก็บข้อมูลที่ถูกจำกัด

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

adb shell am set-standby-bucket PACKAGE_NAME restricted

ความปลอดภัยและความเป็นส่วนตัว

ตำแหน่งโดยประมาณ

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

ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ผู้ใช้จะขอให้แอปมีสิทธิ์เข้าถึงเฉพาะข้อมูลตำแหน่งโดยประมาณเท่านั้น

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

กล่องโต้ตอบสิทธิ์ของระบบมีตัวเลือกต่อไปนี้สำหรับผู้ใช้ ดังที่แสดงในรูปที่ 1

  • แน่นอน: ให้สิทธิ์เข้าถึงข้อมูลตำแหน่งที่แน่นอน
  • โดยประมาณ: ให้การเข้าถึงเฉพาะข้อมูลตําแหน่งโดยประมาณเท่านั้น

การเปิด/ปิดไมโครโฟนและกล้อง

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับปุ่มเปิด/ปิดเหล่านี้ และวิธีตรวจสอบว่าแอปเป็นไปตามแนวทางปฏิบัติแนะนำเกี่ยวกับสิทธิ์ CAMERA และ RECORD_AUDIO

สัญญาณบอกสถานะไมโครโฟนและกล้อง

ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป เมื่อแอปเข้าถึงไมโครโฟนหรือกล้อง ไอคอนจะปรากฏในแถบสถานะ

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

การ์ดการตั้งค่าด่วนจะมีป้ายกำกับว่า &quot;การเข้าถึงกล้อง&quot; และ &quot;การเข้าถึงไมโครโฟน&quot;
รูปที่ 2 เปิด/ปิดไมโครโฟนและกล้องในการตั้งค่าด่วน
สี่เหลี่ยมผืนผ้าที่โค้งมนที่มุมขวาบน ซึ่งประกอบด้วยไอคอนกล้องและไอคอนไมโครโฟน
รูปที่ 3 สัญญาณบอกสถานะไมโครโฟนและกล้องถ่ายรูป ซึ่งจะแสดงการเข้าถึงข้อมูลล่าสุด

ระดับการเข้าถึงแพ็กเกจสิทธิ์

ในอุปกรณ์ที่ใช้ 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 การกำหนดค่าล้มเหลวก่อนหน้านี้

  • คุณเริ่มต้นการเข้ารหัส Galois/Counter Mode (GCM) โดยใช้ขนาดที่ไม่ใช่ 12 ไบต์ การติดตั้งใช้งาน GcmParameterSpec ของ Conscrypt ต้องมีการเริ่มต้น 12 ไบต์ตามที่ NIST แนะนำ

การแจ้งเตือนการเข้าถึงคลิปบอร์ด

ใน Android 12 ขึ้นไป เมื่อแอปเรียกใช้ getPrimaryClip() เพื่อเข้าถึงข้อมูลคลิปจากแอปอื่นเป็นครั้งแรก ระบบจะแสดงข้อความแจ้งเตือนการเข้าถึงคลิปบอร์ดนี้แก่ผู้ใช้

ข้อความในข้อความโทสต์จะมีรูปแบบต่อไปนี้ APP pasted from your clipboard.

ข้อมูลเกี่ยวกับข้อความในคำอธิบายคลิป

ใน Android 12 ขึ้นไป getPrimaryClipDescription() จะตรวจหารายละเอียดต่อไปนี้ได้

  • ข้อความที่ได้รับการปรับแต่ง โดยใช้ isStyledText()
  • การแยกประเภทข้อความที่แตกต่างกัน เช่น URL โดยใช้ getConfidenceScore()

แอปปิดกล่องโต้ตอบของระบบไม่ได้

เราเลิกใช้งานการดำเนินการของความตั้งใจ 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 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 เปลี่ยนการจัดการเริ่มต้นของการกดแป้น Back ของระบบในกิจกรรมของ Launcher ที่เป็นต้นทางของงาน ในเวอร์ชันก่อนหน้านี้ ระบบจะดำเนินการเหล่านี้ให้เสร็จสิ้นเมื่อกดแป้น Back ใน Android 12 ตอนนี้ระบบจะย้ายกิจกรรมและงานของกิจกรรมไปยังเบื้องหลังแทนที่จะทำงานให้เสร็จ ลักษณะการทำงานใหม่นี้ตรงกับลักษณะการทำงานปัจจุบันเมื่อออกจากแอปโดยใช้ปุ่มหน้าแรกหรือท่าทางสัมผัส

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

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

โปรดทราบด้วยว่า โดยทั่วไป เราขอแนะนำให้ใช้ AndroidX Activity API สำหรับการจัดเตรียมการนำทางกลับที่กำหนดเองแทนการลบล้าง onBackPressed() AndroidX Activity API จะเลื่อนไปตามลักษณะการทำงานที่เหมาะสมของระบบโดยอัตโนมัติ หากไม่มีองค์ประกอบขัดขวางการกดย้อนกลับของระบบ

กราฟิกและรูปภาพ

ปรับปรุงการสลับอัตราการรีเฟรช

ใน Android 12 การเปลี่ยนแปลงอัตราการรีเฟรชโดยใช้ setFrameRate() อาจเกิดขึ้นได้ไม่ว่าจอแสดงผลจะรองรับการเปลี่ยนไปใช้อัตราการรีเฟรชใหม่อย่างราบรื่นหรือไม่ การเปลี่ยนที่ราบรื่นคือจะไม่มีการรบกวนภาพ เช่น หน้าจอสีดำเป็นเวลา 1 หรือ 2 วินาที ก่อนหน้านี้หากจอแสดงผลไม่รองรับการเปลี่ยนที่ราบรื่น โดยทั่วไปจะใช้อัตราการรีเฟรชเดิมต่อไปหลังจากเรียก setFrameRate() คุณตรวจสอบล่วงหน้าได้ว่าการเปลี่ยนไปใช้การรีเฟรชใหม่จะราบรื่นหรือไม่ด้วยการเรียกใช้ getAlternativeRefreshRates() โดยทั่วไปแล้ว ระบบจะเรียกใช้ Callback 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

โปรดดูข้อมูลเพิ่มเติมที่ API คำแนะนำ Wi-Fi สำหรับการเชื่อมต่ออินเทอร์เน็ต

ข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK ที่อัปเดตแล้ว

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

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

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงใน Android เวอร์ชันนี้ได้ที่การอัปเดตข้อจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 12 ดูข้อมูลเพิ่มเติมเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK ทั่วไปได้ที่ข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK