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

แพลตฟอร์ม 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 Intent จะเปลี่ยนเป็นแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน

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

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

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

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

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

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

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

เพื่อลดการทำงานของแอปพลิเคชันที่ใช้ Display API เพื่อเรียกข้อมูล ขอบเขตของแอปพลิเคชัน Android 12 จะจำกัดค่าที่ API แสดงผล สำหรับแอปที่ปรับขนาดได้ไม่เต็มที่ ซึ่งอาจมีผลกระทบต่อ แอปที่ใช้ข้อมูลนี้กับ MediaProjection

แอปควรใช้ API ของ WindowMetrics เพื่อค้นหาขอบเขตของ หน้าต่างของผู้ใช้ และ Configuration.densityDpi เพื่อค้นหาความหนาแน่นปัจจุบัน

หากต้องการความเข้ากันได้ที่กว้างขึ้นกับ Android เวอร์ชันเก่า คุณสามารถใช้ ไลบรารี Jetpack WindowManager ซึ่ง รวมชั้นเรียน 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" แอปจะอยู่ในโหมดความเข้ากันได้เมื่อจำเป็นเพื่อรองรับการแสดงผล

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

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

การเปลี่ยนแปลงนี้จะส่งผลต่อแอปของคุณในกรณีต่อไปนี้

  • แอปของคุณใช้ขนาดคีย์ 512 บิต Conscrypt ไม่รองรับคีย์ขนาดนี้ หากจำเป็น ให้อัปเดตตรรกะวิทยาการเข้ารหัสของแอปให้ใช้คีย์ขนาดต่างๆ
  • แอปของคุณใช้ขนาดคีย์ที่ไม่ถูกต้องกับ KeyGenerator การนำ Conscrypt ไปใช้งาน KeyGenerator ดำเนินการเพิ่มเติม ตรวจสอบความถูกต้องของพารามิเตอร์ที่สำคัญ เทียบกับ BouncyCastle ตัวอย่างเช่น Conscrypt ไม่อนุญาตให้แอปของคุณสร้างคีย์ AES 64 บิต เนื่องจาก AES รองรับเฉพาะ คีย์ 128, 192 และ 256 บิต

    BouncyCastle อนุญาตให้สร้างคีย์ที่มีขนาดไม่ถูกต้อง แต่สร้างไม่สำเร็จในภายหลัง หากใช้คีย์เหล่านี้กับ Cipher การกำหนดค่าล้มเหลวก่อนหน้านี้

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

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

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

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

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

ใน Android 12 ขึ้นไป getPrimaryClipDescription() จะทำสิ่งต่อไปนี้ได้ ตรวจพบรายละเอียดต่อไปนี้

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

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

เพื่อปรับปรุงการควบคุมของผู้ใช้เมื่อโต้ตอบกับแอปและระบบ ACTION_CLOSE_SYSTEM_DIALOGS เราเลิกใช้งานการดำเนินการ Intent แล้วตั้งแต่ 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 ขึ้นไป

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

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

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

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

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

การสลับอัตราการรีเฟรชที่ปรับปรุงใหม่

ใน 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 ซึ่งจำกัดขอบเขตตามข้อกำหนดและเงื่อนไข ต้องเรียกใช้ API นี้ก่อนเพื่อให้แน่ใจว่าอุปกรณ์รองรับความสามารถดังกล่าว หากอุปกรณ์ไม่รองรับความสามารถ จะไม่สามารถเชื่อมต่อกับ ต้องแนะนำเครือข่ายนี้และเครือข่ายอื่นหรือเครือข่ายเดิม
  • isDecoratedIdentitySupported(): เมื่อมีการตรวจสอบสิทธิ์ไปยังเครือข่ายที่มีการตกแต่งคำนำหน้า การตั้งค่า คำนำหน้าข้อมูลประจำตัวอนุญาตให้ผู้ให้บริการเครือข่ายอัปเดตการเข้าถึงเครือข่าย ตัวระบุ (NAI) เพื่อทำการกำหนดเส้นทางที่ชัดเจนผ่านพร็อกซีหลายรายการภายใน ของเครือข่าย AAA (โปรดดู RFC 7542 สำหรับ เกี่ยวกับเรื่องนี้เพิ่มเติม)

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

ในการสร้างคำแนะนำ Passpoint แอปต้องใช้ PasspointConfiguration Credential และ HomeSp ชั้นเรียน เหล่านี้ คลาสจะอธิบายโปรไฟล์ Passpoint ซึ่งกำหนดไว้ใน Wi-Fi Alliance รหัสผ่าน ข้อกำหนดเฉพาะ

โปรดดูข้อมูลเพิ่มเติมที่ 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 อินเทอร์เฟซ