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

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

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

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

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

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

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

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

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 เวอร์ชันเก่าๆ มากขึ้น คุณสามารถใช้ไลบรารี WindowManager ของ Jetpack ซึ่งมีคลาส WindowMetrics ที่รองรับ Android 4.0 (API ระดับ 14) ขึ้นไป

ตัวอย่างวิธีใช้ WindowMetrics

ก่อนอื่น ให้ตรวจสอบว่ากิจกรรมของแอปปรับขนาดได้อย่างเต็มที่

กิจกรรมควรอาศัย WindowMetrics จากบริบทกิจกรรมสำหรับงานที่เกี่ยวข้องกับ UI โดยเฉพาะ WindowManager.getCurrentWindowMetrics() หรือ Jetpack ของ WindowMetricsCalculator.computeCurrentWindowMetrics()

หากแอปสร้าง 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 ไม่ได้ในภายหลัง Conscrypt ดำเนินการไม่สำเร็จก่อนหน้านี้

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

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

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

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

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

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