Chế độ tương thích với thiết bị

Android kích hoạt chế độ tương thích cho những ứng dụng khai báo các quy tắc hạn chế về hướng và khả năng đổi kích thước. Chế độ tương thích đảm bảo hành vi được chấp nhận của ứng dụng trên thiết bị có màn hình lớn và điện thoại gập có thể gập lại, nhưng khả năng hữu dụng chưa đạt mức tối ưu.

Tính năng Ghi đè cho mỗi ứng dụng cho phép nhà sản xuất thiết bị thay đổi hành vi của ứng dụng để cải thiện trải nghiệm người dùng hoặc ngăn ứng dụng gặp lỗi trên các thiết bị cụ thể.

Thiết bị tham chiếu

Các thiết bị sau có thể yêu cầu ghi đè cho mỗi ứng dụng do cấu hình bất thường hoặc cấu hình không được các ứng dụng hỗ trợ tốt:

  • Máy tính bảng: Hướng tự nhiên của một số máy tính bảng, chẳng hạn như Pixel Tablet, là hướng ngang. Một thiết bị ở hướng tự nhiên khi Display#getRotation() trả về Surface.ROTATION_0. Nếu các ứng dụng giả định ROTATION_0 là dọc, thì bố cục ứng dụng và bản xem trước của máy ảnh có thể không khớp với màn hình thiết bị.
  • Thiết bị có thể gập lại theo hướng ngang: Một số thiết bị có thể gập lại (chẳng hạn như Pixel Fold) sẽ ở hướng dọc khi gập lại, nhưng hướng ngang khi mở ra. Nếu ứng dụng giả định hướng mở là hướng dọc, thì có thể vòng lặp nhấp nháy hoặc các vấn đề về bố cục.
  • Điện thoại gập có thể gập lại: Điện thoại gập khi mở thường có hướng dọc. Tuy nhiên, khi gập lại, điện thoại thường có một màn hình nhỏ theo hướng ngang. Ứng dụng phải xác định và phù hợp với các hướng khác nhau của màn hình.

Các vấn đề thường gặp về khả năng tương thích

Các ứng dụng thường gặp vấn đề về khả năng tương thích do các quy tắc hạn chế về hướng ứng dụng, các quy tắc hạn chế về khả năng đổi kích thước và tỷ lệ khung hình, việc xử lý không đúng cách hướng bản xem trước của máy ảnh cũng như các API bị sử dụng sai mục đích.

Hiệu ứng hòm thư

Hiệu ứng hòm thư (letterboxing) đặt ứng dụng ở chính giữa màn hình hoặc trên màn hình lớn, sang một bên hoặc bên kia để thuận tiện truy cập. Hiệu ứng mờ (thanh có màu đồng nhất hoặc hình nền mờ) lấp đầy khu vực hiển thị chưa sử dụng dọc theo các cạnh hoặc ở đầu và cuối ứng dụng.

Hiệu ứng hòm thư thường diễn ra trên thiết bị có màn hình lớn do kích thước và tỷ lệ khung hình của màn hình thiết bị thường khác với kích thước và tỷ lệ khung hình của điện thoại tiêu chuẩn mà hầu hết các ứng dụng nhắm đến.

Hình 1. Ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc được tạo hiệu ứng hòm thư trên máy tính bảng xoay ngang và có thể gập lại.

Vấn đề

Do có hướng và tỷ lệ khung hình cố định hoặc không thể đổi kích thước, nên ứng dụng chỉ hỗ trợ một số cấu hình màn hình.

Dưới đây là các chế độ cài đặt cấu hình kiểm soát khả năng đổi kích thước và hướng ứng dụng:

  • screenOrientation: Chỉ định một hướng cố định cho ứng dụng. Các ứng dụng cũng có thể đặt hướng trong thời gian chạy bằng cách dùng Activity#setRequestedOrientation().

  • resizeableActivity: Cho biết liệu hệ thống có thể đổi kích thước các ứng dụng cho vừa với nhiều kích thước cửa sổ hay không. Trên Android 11 (API cấp 30) trở xuống, hãy chỉ định xem ứng dụng có hỗ trợ chế độ nhiều cửa sổ hay không. Trên Android 12 (API cấp 31) trở lên, hãy chỉ định xem ứng dụng có hỗ trợ chế độ nhiều cửa sổ trên màn hình nhỏ hay không (lớp kích thước cửa sổ nhỏ gọn). Trên Android 12 trở lên, các ứng dụng hỗ trợ chế độ nhiều cửa sổ trên màn hình lớn (lớp kích thước cửa sổ trung bình hoặc mở rộng) bất kể chế độ cài đặt này là gì.

  • maxAspectRatio: Chỉ định tỷ lệ khung hình tối đa mà ứng dụng hỗ trợ. Chỉ những ứng dụng có resizeableActivity được đặt là false mới có thể đặt maxAspectRatio.

  • minAspectRatio: Chỉ định tỷ lệ khung hình tối thiểu mà ứng dụng hỗ trợ. Chỉ những ứng dụng có resizeableActivity được đặt là false mới có thể đặt minAspectRatio.

Tối ưu hoá

Ứng dụng phải hỗ trợ tất cả các hướng và kích thước màn hình của thiết bị cũng như chế độ nhiều cửa sổ. Xoá mọi hạn chế về hướng và tỷ lệ khung hình cố định khỏi bố cục ứng dụng cũng như tệp kê khai ứng dụng.

Giải pháp về khả năng tương thích

Nếu một ứng dụng có hướng hoặc tỷ lệ khung hình cố định chạy trong một cửa sổ mà ứng dụng không trực tiếp hỗ trợ hướng hoặc kích thước cửa sổ, thì Android sẽ gửi hòm thư cho ứng dụng đó để duy trì tính liên tục.

Kể từ Android 12 (API cấp 31) và tiếp tục với 12L (API cấp 32), nền tảng này sẽ áp dụng nhiều tính năng nâng cao cho các ứng dụng dạng hòm thư. Nhà sản xuất thiết bị triển khai các tính năng nâng cao cho giao diện người dùng. Bạn không cần phát triển thêm bất kỳ tính năng nào cho ứng dụng để hưởng lợi từ những điểm cải tiến này.

Android 12 (API cấp 31) ra mắt các tính năng nâng cao mang tính thẩm mỹ mà nhà sản xuất thiết bị có thể định cấu hình, đó là:

  • Góc bo tròn: Các góc của cửa sổ ứng dụng có giao diện tinh tế hơn.
  • Độ trong suốt của thanh hệ thống: Các thanh trạng thái và thanh điều hướng phủ trên ứng dụng có dạng bán trong suốt, làm cho các biểu tượng trên thanh luôn có thể xem được trên nền hòm thư.
  • Tỷ lệ khung hình có thể định cấu hình: Bạn có thể điều chỉnh tỷ lệ khung hình của ứng dụng để cải thiện giao diện của ứng dụng.

Hình 2. Ứng dụng dạng hòm thư có các tính năng nâng cao cho giao diện người dùng.

12L (API cấp 32) bổ sung một số điểm cải tiến về chức năng như sau:

  • Vị trí có thể định cấu hình: Trên màn hình lớn, nhà sản xuất thiết bị có thể đặt ứng dụng ở bên trái hoặc bên phải màn hình, giúp tương tác dễ dàng hơn.

  • Nút khởi động lại được thiết kế lại: Nhà sản xuất thiết bị có thể mang đến diện mạo mới cho nút khởi động lại trong chế độ tương thích với kích thước để giúp người dùng dễ nhận ra hơn.

Android 13 (API cấp 33) bổ sung một hộp thoại hướng dẫn người dùng về cách định vị ứng dụng dạng hòm thư trên màn hình hoặc cách thêm hòm thư ở chế độ chia đôi màn hình:

Hình 3. Ứng dụng dạng hòm thư có hộp thoại hướng dẫn người dùng.

Chế độ tương thích với kích thước

Chế độ tương thích với kích thước là hiệu ứng hòm thư có chứa nút điều khiển khởi động lại. Với nút điều khiển này, người dùng có thể khởi động lại ứng dụng và vẽ lại màn hình. Android gọi chế độ tương thích với kích thước cho các ứng dụng được xác định là không thể đổi kích thước. Khi một hoạt động chuyển sang một vùng chứa hiển thị không tương thích với kích thước của hoạt động, hệ thống có thể điều chỉnh kích thước của ứng dụng để lấp đầy màn hình thiết bị ở ít nhất một kích thước.

Thay đổi về cấu hình thiết bị có thể kích hoạt chế độ tương thích với kích thước như sau:

  • Xoay thiết bị
  • Gấp hoặc mở thiết bị có thể gập lại
  • Thay đổi giữa chế độ hiển thị toàn màn hình và chế độ chia đôi màn hình

Vấn đề

Chế độ tương thích với kích thước thường áp dụng cho các hoạt động bị hạn chế theo hướng hoặc tỷ lệ khung hình và được định cấu hình (hoặc do hệ thống xác định) để không thể đổi kích thước.

Ứng dụng của bạn được xem là có thể đổi kích thước và sẽ không được đặt ở chế độ tương thích với kích thước nếu đáp ứng bất kỳ tiêu chí nào sau đây:

Nếu không đáp ứng điều kiện nào, thì ứng dụng của bạn sẽ được xem là không thể đổi kích thước và có thể được đặt ở chế độ tương thích với kích thước.

Tối ưu hoá

Ứng dụng phải hỗ trợ mọi kích thước màn hình. Cho phép ứng dụng đổi kích thước bằng cách đặt thuộc tính android:resizeableActivity của phần tử <activity> hoặc <application> thành true trong tệp kê khai ứng dụng. Thiết kế bố cục thích ứng cho ứng dụng của bạn. Để biết thêm thông tin, hãy xem bài viết Hỗ trợ nhiều kích thước màn hìnhHỗ trợ chế độ nhiều cửa sổ.

Giải pháp về khả năng tương thích

Android đặt một ứng dụng vào chế độ tương thích với kích thước khi hệ thống xác định rằng màn hình của ứng dụng dạng hòm thư có thể cải thiện được bằng cách điều chỉnh kích thước của ứng dụng để lấp đầy cửa sổ hiển thị theo ít nhất một chiều. Hệ thống sẽ hiện một nút điều khiển khởi động lại để tạo lại quy trình của ứng dụng, hoạt động và vẽ lại màn hình. Xem thêm bài viết Tổng quan về quy trình và luồng.

Vòng lặp nhấp nháy

Khi không hỗ trợ tất cả hướng hiển thị, ứng dụng có thể liên tục yêu cầu hướng mới khi có thay đổi về cấu hình, tạo ra một vòng lặp vô hạn khiến màn hình nhấp nháy hoặc ứng dụng xoay liên tục.

Vấn đề

Trên Android 12 (API cấp 31) trở lên, nhà sản xuất thiết bị có thể định cấu hình thiết bị để bỏ qua các quy tắc hạn chế về hướng do ứng dụng chỉ định và thay vào đó thực thi các chế độ tương thích. Ví dụ: một thiết bị có thể gập lại có thể bỏ qua chế độ cài đặt android:screenOrientation="portrait" của một hoạt động khi hoạt động này xuất hiện trên màn hình bên trong xoay ngang, có kích thước máy tính bảng của thiết bị.

Nếu các quy tắc hạn chế về hướng của một ứng dụng bị bỏ qua, thì ứng dụng đó có thể đặt hướng bằng cách gọi Activity#setRequestedOrientation(). Lệnh gọi này kích hoạt quá trình khởi động lại một ứng dụng nếu ứng dụng đó hiện không xử lý các thay đổi về cấu hình (xem phần Xử lý các thay đổi về cấu hình). Sau khi khởi động lại, các quy tắc hạn chế về hướng của ứng dụng lại bị bỏ qua, ứng dụng lặp lại lệnh gọi đến setRequestedOrientation(), lệnh gọi kích hoạt quá trình khởi động lại ứng dụng, v.v. trong một vòng lặp tự duy trì.

Bạn có thể gặp phải vấn đề này theo cách khác, đó là khi hướng tự nhiên (hướng thông thường do Android xác định) của màn hình thiết bị là hướng ngang (tức là việc gọi Display#getRotation() trả về Surface.ROTATION_0 trong khi thiết bị có tỷ lệ khung hình ngang). Trước đây, các ứng dụng giả định rằng Display.getRotation() = Surface.ROTATION_0 có nghĩa là thiết bị ở hướng dọc. Tuy nhiên, điều này không phải lúc nào cũng đúng, ví dụ như trên màn hình bên trong của một số thiết bị có thể gập lại và trên một số máy tính bảng.

Một ứng dụng ở hướng ngang trên màn hình bên trong có thể gập lại, có thể kiểm tra chế độ xoay màn hình, nhận giá trị là ROTATION_0, giả định hướng tự nhiên của thiết bị là dọc và gọi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) để định cấu hình lại bố cục ứng dụng. Sau khi khởi động lại (theo hướng ngang), ứng dụng có thể kiểm tra lại chế độ xoay màn hình, nhận giá trị là ROTATION_0, gọi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) và tiếp tục vòng lặp vô hạn.

Tối ưu hoá

Ứng dụng không nên làm những việc sau:

  • Đặt một hướng mặc định bằng Activity#setRequestedOrientation() trong phương thức onCreate() của hoạt động vì yêu cầu về hướng có thể được kích hoạt đột ngột bằng các thay đổi về cấu hình chưa được xử lý
  • Giả sử hướng tự nhiên (ROTATION_0) của thiết bị là hướng dọc
  • Đặt hướng dựa trên các tín hiệu không liên quan đến kích thước cửa sổ hiện tại, chẳng hạn như Display#getRotation(), sự hiện diện của FoldingFeature hoặc API không dùng nữa.

Giải pháp về khả năng tương thích

Android bỏ qua các lệnh gọi đến Activity#setRequestedOrientation() trong những trường hợp sau:

  • Hoạt động này đã chạy lại từ một lệnh gọi phương thức trước đó hoặc quá trình xử lý tính năng buộc xoay tương thích với máy ảnh đã được bật (xem phần Bản xem trước của máy ảnh ở bên dưới).

    Nhà sản xuất thiết bị có thể áp dụng hành vi này cho một ứng dụng bằng OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION.

  • Hoạt động này đã thực hiện hơn 2 yêu cầu liên quan đến hướng trong một giây, điều này cho thấy một vòng lặp đã xảy ra. Trong 2 yêu cầu trong vòng lặp này, Android sử dụng một yêu cầu nhằm tối đa hoá khu vực hiển thị ứng dụng.

    Nhà sản xuất thiết bị có thể áp dụng hành vi này cho một ứng dụng bằng OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED.

Bản xem trước của máy ảnh

Bản xem trước của máy ảnh (hoặc kính ngắm) của các ứng dụng máy ảnh có thể bị lệch hoặc méo trên máy tính bảng, máy tính xách tay và màn hình có thể gập lại.

Vấn đề

Tài liệu định nghĩa về khả năng tương thích với Android cho biết bạn "PHẢI định hướng cảm biến hình ảnh của máy ảnh để chiều dài của máy ảnh khớp với chiều dài của màn hình".

Các ứng dụng thường giả định rằng hướng thiết bị và hướng cảm biến của máy ảnh là hướng dọc — một giả định hợp lý trên điện thoại di động tiêu chuẩn. Tuy nhiên, hướng tự nhiên của máy tính bảng, máy tính xách tay và cảm biến của máy ảnh có thể là hướng ngang. Ngoài ra, các kiểu dáng mới như thiết bị có thể gập lại có thể có nhiều hướng tự nhiên và nhiều cảm biến của máy ảnh ở các hướng khác nhau.

Việc khởi động một hoạt động có hướng máy ảnh mà ứng dụng không mong đợi hoặc việc chuyển đổi giữa nhiều máy ảnh hoặc màn hình thiết bị (đối với thiết bị có thể gập lại) có thể khiến bản xem trước của máy ảnh bị lệch hoặc méo.

Tối ưu hoá

Các ứng dụng máy ảnh phải xác định và quản lý chính xác hướng thiết bị cũng như hướng cảm biến máy ảnh để hiển thị chính xác bản xem trước của máy ảnh được căn chỉnh và điều chỉnh theo tỷ lệ. Ứng dụng phải tính toán hướng xoay thiết bị, hướng xoay cảm biến và tỷ lệ khung hình của màn hình hoặc cửa sổ, sau đó áp dụng kết quả cho bản xem trước của máy ảnh. Để được hướng dẫn chi tiết, hãy xem bài viết Bản xem trước của máy ảnhGiới thiệu về kính ngắm của máy ảnh.

Giải pháp về khả năng tương thích

Một thiết bị ở hướng tự nhiên khi Display#getRotation() trả về Surface.ROTATION_0. Hệ thống sẽ tính CameraCharacteristics.SENSOR_ORIENTATION theo hướng tự nhiên của thiết bị này. Android sẽ căn chỉnh cửa sổ dọc của các ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc với hướng tự nhiên của thiết bị này, đây là điều mà hầu hết các ứng dụng đều mong đợi. Android cũng cắt hình ảnh cảm biến của máy ảnh khi hướng cảm biến ở chế độ ngang và bản xem trước của máy ảnh ở chế độ dọc. Dưới đây là các giải pháp cụ thể:

  • Buộc xoay bản xem trước của máy ảnh cho ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc: Ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc sẽ mong đợi hướng tự nhiên của thiết bị và hướng cảm biến của máy ảnh là hướng dọc. Tuy nhiên, trên Android 12 (API cấp 31) trở lên, ứng dụng có thể chạy ở nhiều hướng thiết bị nếu nhà sản xuất thiết bị bỏ qua thông số kỹ thuật của hướng.

    Khi một ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc được kết nối với máy ảnh, Android sẽ buộc xoay ứng dụng này để căn chỉnh cửa sổ dọc của ứng dụng với hướng tự nhiên của thiết bị.

    Trên một số máy tính bảng (xem thiết bị tham chiếu), cửa sổ dọc của ứng dụng được xoay sang chế độ dọc toàn màn hình cho phù hợp với hướng tự nhiên của thiết bị. Ứng dụng sẽ chiếm toàn màn hình sau khi buộc xoay.

    Trên màn hình bên trong theo hướng ngang của thiết bị có thể gập lại (xem thiết bị tham chiếu), các hoạt động chỉ hiển thị theo hướng dọc sẽ được xoay thành hướng ngang cho phù hợp với hướng tự nhiên khi mở. Ứng dụng sẽ có dạng hòm thư sau khi buộc xoay.

  • Cắt trường nhìn bên trong của camera trước: Cảm biến camera trong phía trước trên một số thiết bị có thể gập lại ở hướng ngang. Ngoài việc buộc xoay bản xem trước của máy ảnh trên màn hình bên trong có thể gập lại, Android còn cắt trường nhìn của máy ảnh bên trong phía trước (hướng ngang) để cảm biến chụp một khung hình đối diện với hướng thiết bị.

  • Buộc làm mới bản xem trước của máy ảnh: Hệ thống sẽ chuyển đổi qua các phương thức hoạt động onStop()onStart() (theo mặc định) hoặc onPause()onResume() (được áp dụng bởi chế độ ghi đè OVERRIDE_CAMERA_COMPAT_ENABLE_CHANGERESH_VIA_PAUSE cho mỗi ứng dụng) sau khi buộc xoay để đảm bảo bản xem trước của máy ảnh được hiển thị chính xác.

  • Điều chỉnh tỷ lệ khung hình: Hệ thống tự động thay đổi tỷ lệ khung hình của bản xem trước của máy ảnh đã buộc xoay thành tỷ lệ khung hình tối thiểu cao hơn để đảm bảo bản xem trước của máy ảnh được điều chỉnh theo tỷ lệ một cách chính xác.

Nhà phát triển ứng dụng có thể ghi đè các giải pháp này nếu ứng dụng xử lý bản xem trước của máy ảnh đúng cách. Xem phần Ghi đè cho mỗi ứng dụng.

Những API thường bị sử dụng sai mục đích

Vì Android đã thêm tính năng hỗ trợ cho các tính năng như chế độ nhiều cửa sổ và các thiết bị như thiết bị có thể gập lại, nên các API cũ không còn được dùng nữa và được thay thế bằng các API mới nhất hoạt động được với mọi kích thước màn hình và kiểu dáng thiết bị. Tuy nhiên, các API không dùng nữa vẫn có sẵn để đảm bảo khả năng tương thích ngược.

Một số API View được thiết kế cho các mục đích đặc biệt mà không phải lúc nào nhà phát triển cũng hiểu rõ.

Vấn đề

Nhà phát triển tiếp tục sử dụng các API Display không dùng nữa và giả định không chính xác rằng các API này trả về giới hạn đối với ứng dụng thay vì giới hạn đối với khu vực hiển thị của thiết bị. Ngoài ra, nhà phát triển sử dụng nhầm API khung hiển thị dùng cho mục đích đặc biệt để lấy chỉ số hiển thị chung. Kết quả là tính toán nhầm khi định vị lại các phần tử trên giao diện người dùng sau sự kiện đổi kích thước cửa sổ ứng dụng, gây ra vấn đề về bố cục.

Những API Hiển thị không dùng nữa và thường bị sử dụng sai mục đích:

Để biết thêm thông tin, hãy xem bài viết Hỗ trợ chế độ nhiều cửa sổ.

Những API Khung hiển thị bị sử dụng sai mục đích:

Tối ưu hoá

Tuyệt đối không dựa vào kích thước màn hình thực tế để định vị các phần tử trên giao diện người dùng. Di chuyển ứng dụng của bạn sang các API dựa trên WindowMetrics, bao gồm cả các API WindowManager sau đây:

Giải pháp về khả năng tương thích

2 chế độ ghi đè sẽ điều chỉnh các API Display không dùng nữa và API View bị sử dụng sai mục đích để trả về giới hạn đối với ứng dụng: ALWAYS_SANDBOX_DISPLAY_APIS cho API Display; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS cho API View. Theo mặc định, ALWAYS_SANDBOX_DISPLAY_APIS cũng được áp dụng cho các ứng dụng đủ điều kiện dùng chế độ tương thích với kích thước.

Hoạt động rõ

Hoạt động rõ là kết quả của các kiểu nền trong suốt, ví dụ:

<style name="Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Các giao diện liên quan đến hộp thoại (chẳng hạn như Theme.MaterialComponents.Dialog) có thể bao gồm các kiểu giúp hoạt động trở nên rõ.

Các hoạt động rõ không bao gồm mọi không gian hiển thị có sẵn, khiến bạn khó quản lý vì khu vực hiển thị có sẵn có thể thay đổi theo các thay đổi về cấu hình như xoay thiết bị, gập và mở thiết bị cũng như chế độ nhiều cửa sổ.

Vấn đề

Một hoạt động rõ cần tuân theo các giới hạn của hoạt động mờ đầu tiên bên dưới hoạt động rõ trong ngăn xếp hoạt động của tác vụ. Tuy nhiên, một hoạt động mờ chạy hộp thoại cấp quyền có thể là hoạt động đàn hồi (hoạt động chạy một hoạt động khác sau đó biến mất); và do đó, hệ thống không thể xác định giới hạn của hoạt động đàn hồi đã chạy hoạt động hộp thoại cấp quyền minh bạch.

Tối ưu hoá

Các hoạt động rõ kế thừa các hạn chế từ hoạt động mờ cao nhất bên dưới chúng trong ngăn xếp hoạt động của một tác vụ. Hoạt động mờ phải có sẵn cho toàn bộ vòng đời của hoạt động minh bạch, từ khi tạo hoạt động cho đến huỷ bỏ. Vì lý do này, không chạy các yêu cầu quyền từ các hoạt động đàn hồi.

Nếu một hoạt động đàn hồi chạy một yêu cầu cấp quyền, thì người dùng có thể không thấy hộp thoại cấp quyền vì hoạt động đàn hồi này đã bị huỷ bỏ trước khi người dùng có cơ hội phản hồi hộp thoại đó, đồng thời kích thước và vị trí của hoạt động hộp thoại có thể đã được tính toán không chính xác.

Ứng dụng nên luôn chạy các yêu cầu quyền từ những hoạt động vẫn hiển thị cho đến khi người dùng đưa ra quyết định cấp quyền.

Góc bo tròn

Một hoạt động có thể trong suốt do kiểu chỉ định độ trong suốt của nền hoặc do nội dung của hoạt động không lấp đầy không gian hiển thị có sẵn. Nếu một hoạt động rõ lấp đầy không gian hiển thị có sẵn, thì hệ thống sẽ tự động áp dụng các góc bo tròn cho hoạt động này khi nhà sản xuất thiết bị định cấu hình làm như vậy. Tuy nhiên, nếu một hoạt động rõ (như hộp thoại cấp quyền) không lấp đầy không gian có sẵn, thì bạn có quyền quyết định xem có áp dụng các góc bo tròn hay không.

Hộp thoại cấp quyền không lấp đầy không gian hiển thị có sẵn vì bố cục hộp thoại thường dùng LayoutParams.WRAP_CONTENT thay vì LayoutParams.MATCH_PARENT.

Giải pháp về khả năng tương thích

Duy trì hiển thị các hoạt động chạy hoạt động của hộp thoại cho đến khi người dùng phản hồi hộp thoại đó.

Hệ thống đảm bảo rằng một hoạt động rõ kế thừa tất cả các quy tắc hạn chế của hoạt động mờ đầu tiên bên dưới hoạt động rõ trong ngăn xếp hoạt động, bao gồm cả các quy tắc hạn chế liên quan đến:

  • Chế độ tương thích với kích thước
  • Hướng
  • Tỷ lệ khung hình

Trò chơi viết bằng Unity

Các trò chơi viết bằng Unity chạy trên toàn màn hình Android hoặc ở chế độ nhiều cửa sổ. Tuy nhiên, nhiều trò chơi viết bằng Unity bị mất tiêu điểm và dừng vẽ nội dung khi ứng dụng được đặt ở chế độ nhiều cửa sổ.

Vấn đề

Unity đã thêm một lựa chọn Resizable Window trong Unity 2019.4 để hỗ trợ chế độ nhiều cửa sổ trên Android. Tuy nhiên, cách triển khai ban đầu đã phản ứng không đúng cách với vòng đời hoạt động ở chế độ nhiều cửa sổ, khiến UnityPlayer tạm ngưng phát lại khi ứng dụng mất tiêu điểm. Người chơi nhìn thấy một màn hình đen hoặc khung hình cuối cùng của trò chơi bị treo. Trò chơi chỉ được tiếp tục khi người dùng nhấn vào màn hình. Nhiều ứng dụng dùng công cụ Unity gặp phải vấn đề này và hiển thị dưới dạng một cửa sổ màu đen ở chế độ nhiều cửa sổ.

Tối ưu hoá

Nâng cấp Unity lên 2019.4.40 trở lên rồi xuất lại trò chơi của bạn. Giữ nguyên lựa chọn Resizable Window trong phần cài đặt Trình phát Android, nếu không trò chơi sẽ tạm dừng khi không được đặt tiêu điểm mặc dù trò chơi hoàn toàn hiển thị ở chế độ nhiều cửa sổ.

Giải pháp về khả năng tương thích

Nhà sản xuất thiết bị có thể áp dụng chế độ ghi đè cho mỗi ứng dụng OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS để cung cấp sự kiện lấy tiêu điểm giả cho một ứng dụng ở chế độ nhiều cửa sổ. Tính năng ghi đè này cho phép hoạt động vẽ lại nội dung và không bị bôi đen.

Kiểm thử ứng dụng để tìm vấn đề về khả năng tương thích

Để kiểm thử ứng dụng của bạn và hiểu cách ứng dụng hoạt động trên nhiều kiểu dáng, hãy tận dụng các tài nguyên sau:

Ở dạng hòm thư

Hãy xác minh rằng mỗi hoạt động có thể sử dụng tất cả không gian hiển thị có sẵn cho ứng dụng. Trước tiên, hãy khai báo mã sau trong thư mục kiểm thử:

Kotlin

fun Activity.isLetterboxed() : Boolean {
    if (isInMultiWindowMode) return false

    val wmc = WindowMetricsCalculator.getOrCreate()
    val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds
    val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds

    val isScreenPortrait = maxBounds.height() > maxBounds.width()

    return if (isScreenPortrait) {
        currentBounds.height() < maxBounds.height()
    } else {
        currentBounds.width() < maxBounds.width()
    }
}

Java

public boolean isLetterboxed(Activity activity) {
    if (activity.isInMultiWindowMode()) {
        return false;
    }

    WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate();
    Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds()
    Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds();

    boolean isScreenPortrait = maxBounds.height() > maxBounds.width();

    return (isScreenPortrait)
        ? currentBounds.height() < maxBounds.height()
        : currentBounds.width() < maxBounds.width();
}

Sau đó, hãy chạy một quy trình kiểm thử để xác nhận hành vi và đảm bảo hoạt động mục tiêu không được tạo hiệu ứng hòm thư:

Kotlin

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test
fun activity_launched_notLetterBoxed() {
    activityRule.scenario.onActivity {
        assertThat(it.isLetterboxed()).isFalse()
    }
}

Java

@Rule
public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

public void activity_launched_notLetterBoxed() {
    try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) {
        scenario.onActivity(activity -> {
            assertThat(isLetterboxed(activity)).isFalse();
        });
    }
}

Tốt nhất là chỉ chạy loại hình kiểm thử này cho đến khi vượt qua và xác nhận rằng các hoạt động của ứng dụng chiếm toàn bộ không gian hiển thị có sẵn cho ứng dụng. Hãy kiểm thử ứng dụng trên tất cả các loại thiết bị để đảm bảo hành vi nhất quán.

Ghi đè cho mỗi ứng dụng

Android cung cấp chế độ ghi đè thay đổi hành vi được định cấu hình của các ứng dụng. Ví dụ: chế độ ghi đè FORCE_RESIZE_APP sẽ hướng dẫn hệ thống bỏ qua chế độ tương thích với kích thước và đổi kích thước ứng dụng cho phù hợp với kích thước màn hình ngay cả khi resizeableActivity="false" được chỉ định trong tệp kê khai ứng dụng.

Nhà sản xuất thiết bị áp dụng chế độ ghi đè cho một số ứng dụng hoặc tất cả ứng dụng trên các thiết bị cụ thể có màn hình lớn. Trên Android 14 (API cấp 34) trở lên, người dùng có thể áp dụng chế độ ghi đè cho các ứng dụng thông qua phần cài đặt thiết bị.

Ghi đè người dùng cho mỗi ứng dụng

Trên Android 14 trở lên, trình đơn cài đặt cho phép người dùng thay đổi tỷ lệ khung hình của ứng dụng. Các thiết bị màn hình lớn như thiết bị tham chiếu sẽ triển khai trình đơn.

Trình đơn này chứa danh sách tất cả ứng dụng đã cài đặt trên thiết bị. Người dùng chọn một ứng dụng rồi đặt tỷ lệ khung hình của ứng dụng thành 3:4, 1:1, toàn màn hình hoặc giá trị khác do nhà sản xuất thiết bị định cấu hình. Người dùng cũng có thể đặt lại tỷ lệ khung hình về tỷ lệ mặc định của ứng dụng, được chỉ định trong tệp kê khai ứng dụng.

Ứng dụng có thể chọn không sử dụng tính năng ghi đè khả năng tương thích bằng cách đặt các thẻ PackageManager.Property sau:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    Để chọn không sử dụng tính năng ghi đè khả năng tương thích với tỷ lệ khung hình của người dùng, hãy thêm thuộc tính này vào tệp kê khai ứng dụng và đặt giá trị thành false:

    <application>
        <property
            android:name="android.window.
            PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE"
            android:value="false" />
    </application>
    

    Ứng dụng của bạn sẽ được loại trừ khỏi danh sách ứng dụng trong phần cài đặt thiết bị. Người dùng sẽ không thể ghi đè tỷ lệ khung hình của ứng dụng.

    Việc đặt thuộc tính này thành true không có hiệu lực.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    Để chọn không sử dụng tuỳ chọn toàn màn hình cho mục ghi đè khả năng tương thích tỷ lệ khung hình của người dùng, hãy thêm thuộc tính này vào tệp kê khai ứng dụng và đặt giá trị thành false:

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE"
            android:value="false" />
    </application>
    

    Tuỳ chọn toàn màn hình bị xoá khỏi danh sách các tuỳ chọn tỷ lệ khung hình trong phần cài đặt thiết bị. Người dùng sẽ không thể áp dụng chế độ ghi đè toàn màn hình cho ứng dụng của bạn.

    Việc đặt thuộc tính này thành true không có hiệu lực.

Tối ưu hoá ứng dụng cho mọi màn hình: Đừng đặt các quy tắc hạn chế về tỷ lệ khung hình trong ứng dụng. Hãy dùng lớp kích thước cửa sổ để hỗ trợ nhiều bố cục dựa trên lượng không gian hiển thị có sẵn.

Ghi đè cho mỗi ứng dụng của nhà sản xuất thiết bị

Nhà sản xuất thiết bị áp dụng chế độ ghi đè cho mỗi ứng dụng trên một số thiết bị. Theo mặc định, thiết bị tham chiếu có thể áp dụng một số chế độ ghi đè cho nhiều ứng dụng.

Ứng dụng có thể chọn không sử dụng hầu hết các chế độ ghi đè (xem bảng Chế độ ghi đè cho mỗi ứng dụng ở bên dưới).

Bạn có thể kiểm thử ứng dụng với các chế độ ghi đè được bật hoặc tắt bằng khung tương thích (xem bài viết Công cụ khung tương thích). Khi được bật, các chế độ ghi đè sẽ áp dụng cho toàn bộ ứng dụng.

Bạn cũng có thể dùng Cầu gỡ lỗi Android (adb) để bật hoặc tắt các chế độ ghi đè và xác định những chế độ ghi đè sẽ áp dụng cho ứng dụng của mình.

Bạn có thể bật hoặc tắt các chế độ ghi đè như sau:

adb shell am compat enable/disable <override name/id> <package>

Đối với thiết bị tham chiếu, hãy kiểm tra xem chế độ ghi đè nào áp dụng cho ứng dụng của bạn:

adb shell dumpsys platform_compat | grep <package name>

Bảng sau đây liệt kê các chế độ ghi đè có sẵn cùng với hướng dẫn về cách tối ưu hoá ứng dụng để ứng dụng không cần dựa vào chế độ ghi đè. Bạn có thể thêm cờ thuộc tính vào tệp kê khai ứng dụng để chọn không sử dụng một số chế độ ghi đè.

Ghi đè cho mỗi ứng dụng
Loại Tên Mã nhận dạng Nội dung mô tả
Khả năng đổi kích thước FORCE_RESIZE_APP 174042936 Bỏ qua chế độ tương thích với kích thước của ứng dụng khi thay đổi cấu hình.
FORCE_NON_RESIZE_APP 181136395 Buộc ứng dụng chuyển vào chế độ tương thích với kích thước khi thay đổi cấu hình.
Tỷ lệ khung hình OVERRIDE_MIN_ASPECT_RATIO 174042980 Chế độ ghi đè yếu tố giám sát phải được bật để áp dụng mọi chế độ ghi đè khác cho tỷ lệ khung hình.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Nếu tuỳ chọn này được bật (mặc định), thì phạm vi ghi đè sẽ chỉ diễn ra đối với các hoạt động chỉ hiển thị theo hướng dọc.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 Thay đổi tỷ lệ khung hình tối thiểu thành 3:2.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 Thay đổi tỷ lệ khung hình tối thiểu thành 16:9.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 Thay đổi tỷ lệ khung hình tối thiểu cho vừa 50% kích thước màn hình (hoặc tỷ lệ khung hình chia đôi màn hình).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Tắt chế độ ghi đè tỷ lệ khung hình tối thiểu để các ứng dụng hiển thị ở chế độ toàn màn hình khi thiết bị xoay dọc.
Hướng OVERRIDE_ANY_ORIENTATION 265464455 Cho phép ghi đè mọi hướng.
OVERRIDE_ANY_ORIENTATION_TO_USER 310816437 Thay thế các quy định hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Ghi đè hướng thành hướng dọc khi một hoạt động có hướng không xác định.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Ghi đè hướng thành nosensor (sử dụng hướng tự nhiên của thiết bị) khi một hoạt động có hướng không xác định.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Xoay 180 độ các ứng dụng chỉ hiển thị theo hướng ngang.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Giới hạn phạm vi ghi đè hướng ở thời điểm ứng dụng được kết nối với máy ảnh.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Đặt màn hình thành hướng ngang tự nhiên cố định khi một nhiệm vụ ở chế độ toàn màn hình (kể cả khi ở dạng hòm thư).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Bỏ qua các yêu cầu về hướng của ứng dụng để tránh xoay vòng lặp vô hạn.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Bỏ qua các yêu cầu về hướng lặp lại trong khi một hoạt động đang chạy lại. Nếu Android phát hiện thấy một ứng dụng đang yêu cầu ít nhất 2 hướng mới trong vòng 1 giây, thì hệ thống sẽ coi đây là một vòng lặp xoay vô hạn và áp dụng chế độ ghi đè.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Ngăn hiệu ứng hòm thư bằng cách tắt chế độ cài đặt bỏ qua yêu cầu về hướng của nhà sản xuất thiết bị.
Sandbox API NEVER_SANDBOX_DISPLAY_APIS 184838306 Ngăn chặn sự thay đổi về hành vi của mọi API hiển thị.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Buộc các API Display trong ứng dụng trả về giới hạn đối với ứng dụng. API Display trả về các giới hạn đối với khu vực hiển thị logic, nhưng đôi khi ứng dụng giả định rằng API Display trả về các giới hạn đối với ứng dụng, dẫn đến các vấn đề liên quan đến giao diện người dùng.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Buộc dùng các API View trong ứng dụng để trả về giới hạn đối với ứng dụng. API View trả về giới hạn đối với khu vực hiển thị logic, nhưng đôi khi ứng dụng giả định rằng API View trả về giới hạn đối với ứng dụng, dẫn đến các vấn đề liên quan đến giao diện người dùng.
Khả năng tương thích với máy ảnh OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Tắt tính năng buộc xoay. Theo mặc định, tất cả các ứng dụng máy ảnh có hướng cố định sẽ bị buộc xoay khi bản xem trước của máy ảnh đang mở.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Xoá chế độ làm mới hoàn toàn mặc định được áp dụng khi bản xem trước của máy ảnh bị buộc xoay.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Chuyển quy trình làm mới hoàn toàn sang làm mới một phần khi bản xem trước của máy ảnh bị buộc xoay, giúp duy trì trạng thái trong khi buộc xoay. Theo mặc định, Android áp dụng một quy trình làm mới hoàn toàn khi bản xem trước của máy ảnh bị buộc xoay. Quá trình làm mới hoàn toàn có thể gây ra vấn đề khiến ứng dụng mất trạng thái hoặc bôi đen, tuỳ thuộc vào cách ứng dụng lưu trạng thái trước đó vào bộ nhớ đệm.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Cắt vùng đệm hình ảnh của trường nhìn bên trong của camera trước. Nếu chế độ ghi đè bị tắt, thì tính năng cắt của trường nhìn bên trong của camera trước sẽ bị xoá và trường nhìn của bản xem trước của camera sẽ tăng lên. Theo mặc định trên một số thiết bị có thể gập lại (xem thiết bị tham chiếu), hệ thống sẽ cắt bản xem trước của tất cả ứng dụng máy ảnh khi dùng camera trước bên trong.
Khác OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Ngăn ứng dụng bị bôi đen khi ứng dụng bị mất tiêu điểm ở chế độ chia đôi màn hình. Ứng dụng sẽ chờ để có tiêu điểm trước khi vẽ nội dung ứng dụng. Điều này có thể khiến ứng dụng bị treo hoặc bị bôi đen. Chế độ ghi đè này cho phép Android gửi một sự kiện tiêu điểm giả cho ứng dụng. Sự kiện này sẽ báo hiệu cho ứng dụng để bắt đầu vẽ lại nội dung.

FORCE_RESIZE_APP

Buộc các gói được áp dụng chế độ ghi đè phải có thể đổi kích thước. Không thay đổi việc ứng dụng có thể được đặt ở chế độ nhiều cửa sổ hay không, nhưng cho phép ứng dụng đổi kích thước mà không phải chuyển sang chế độ tương thích với kích thước khi màn hình đổi kích thước.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Trong tệp kê khai ứng dụng, hãy đặt thuộc tính android:resizeableActivity thành true hoặc để hỗ trợ đổi kích thước trong khi tắt chế độ nhiều cửa sổ bằng android:resizeableActivity=false, hãy đặt cờ siêu dữ liệu android.supports_size_changes thành true.

Cách tối ưu hoá ứng dụng

Sử dụng các bố cục thích ứng để cho phép ứng dụng thích ứng với mọi kích thước hiển thị và tỷ lệ khung hình. Hãy xem bài viết Hỗ trợ nhiều kích thước màn hình.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè và làm cho ứng dụng có thể đổi kích thước:

adb shell am compat enable FORCE_RESIZE_APP <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable FORCE_RESIZE_APP <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

FORCE_NON_RESIZE_APP

Buộc các gói được áp dụng chế độ ghi đè phải không thể đổi kích thước và chuyển sang chế độ tương thích với kích thước khi thay đổi cấu hình.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cả thuộc tính android:resizeableActivity và cờ siêu dữ liệu android.supports_size_changes thành false trong tệp kê khai ứng dụng rồi khai báo một quy tắc hạn chế hướng hoặc tỷ lệ khung hình.

Cách tối ưu hoá ứng dụng

Để tất cả các ứng dụng hoạt động tốt nếu được đổi kích thước, bạn phải đặt android:resizeableActivity hoặc android.supports_size_changes thành true. Bạn phải cải thiện các ứng dụng khác để chúng hoạt động tốt khi được đổi kích thước. Xem android:resizeableActivity.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè và làm cho ứng dụng không thể đổi kích thước:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO

Yếu tố giám sát tất cả chế độ ghi đè buộc có một tỷ lệ khung hình tối thiểu nhất định.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt android:minAspectRatio ở cấp hoạt động hoặc cấp ứng dụng.

Cách tối ưu hoá ứng dụng

Đừng đặt các quy tắc hạn chế tỷ lệ khung hình trong ứng dụng. Hãy đảm bảo ứng dụng hỗ trợ nhiều kích thước màn hình. Sử dụng các lớp kích thước cửa sổ để hỗ trợ nhiều bố cục dựa trên lượng không gian mà ứng dụng có trên màn hình. Xem API Compose WindowSizeClassAPI Khung hiển thị WindowSizeClass.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy chỉ định quy định hạn chế về tỷ lệ khung hình hoặc đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
  android:value="false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Hạn chế các chế độ cài đặt ứng dụng buộc sử dụng một tỷ lệ khung hình tối thiểu nhất định cho các hoạt động chỉ dùng hướng dọc. Được bật theo mặc định và chỉ có hiệu lực nếu bạn cũng bật OVERRIDE_MIN_ASPECT_RATIO.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

Đặt tỷ lệ khung hình tối thiểu của hoạt động thành một giá trị trung bình (3:2)

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Đặt tỷ lệ khung hình tối thiểu của hoạt động thành một giá trị lớn (16:9)

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Cho phép sử dụng tỷ lệ khung hình chia đôi màn hình. Cho phép ứng dụng dùng tất cả không gian có sẵn ở chế độ chia đôi màn hình, tránh hiệu ứng hòm thư.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Tắt chế độ ghi đè tỷ lệ khung hình tối thiểu ở chế độ toàn màn hình dọc để sử dụng tất cả không gian màn hình có sẵn.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ANY_ORIENTATION

Bật các cơ chế ghi đè sau để ghi đè mọi hướng:

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt thuộc tính tệp kê khai activity:screenOrientation hoặc sử dụng API Activity#setRequestedOrientation().

Cách tối ưu hoá ứng dụng

Ứng dụng của bạn phải hỗ trợ tất cả các hướng. Thay đổi về hướng là thay đổi về cấu hình, có thể được xử lý bằng một trong hai cách: cho phép hệ thống huỷ bỏ và tạo lại ứng dụng hoặc tự quản lý các thay đổi về cấu hình. Nếu tự quản lý các thay đổi về cấu hình, thì bạn có thể giữ lại trạng thái ứng dụng bằng cách sử dụng ViewModel. Trong rất ít trường hợp, bạn có thể quyết định chỉ khoá hướng trên màn hình nhỏ, mặc dù làm như vậy có thể không điều chỉnh được theo tỷ lệ cũng như cho phép người dùng xoay ứng dụng khi cần. Trên Android 12L trở lên, bạn có thể ghi đè hướng cố định theo cấu hình thiết bị. Để biết thêm thông tin về cách xử lý các thay đổi về cấu hình và hỗ trợ tất cả các hướng, hãy xem bài viết Xử lý các thay đổi về cấu hình, Tổng quan về ViewModelHướng ứng dụng bị hạn chế trên điện thoại nhưng không bị hạn chế trên thiết bị có màn hình lớn.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

Hàm OVERRIDE_ANY_ORIENTATION_TO_USER

Cho phép ứng dụng lấp đầy không gian hiển thị có sẵn. Ghi đè mọi quy tắc hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình được chỉ định trong tệp kê khai ứng dụng. Đồng thời, bỏ qua mọi lệnh gọi đến Activity#setRequestedOrientation().

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

  • Không đặt thuộc tính tệp kê khai android:screenOrientation hoặc đặt thuộc tính thành "user".

  • Đặt thuộc tính tệp kê khai android:resizeableActivity thành true.

  • Trên màn hình nhỏ, để hỗ trợ đổi kích thước ứng dụng trong khi tắt chế độ nhiều cửa sổ bằng android:resizeableActivity=false, hãy đặt cờ siêu dữ liệu android.supports_size_changes thành true. Không đặt minAspectRatiomaxAspectRatio.

Cách tối ưu hoá ứng dụng

Cho phép ứng dụng hỗ trợ mọi hướng; không đặt thông số kỹ thuật screenOrientation trong tệp kê khai của ứng dụng. Hỗ trợ khả năng đổi kích thước ứng dụng, chế độ nhiều cửa sổ và tất cả tỷ lệ khung hình màn hình bằng cách đặt thuộc tính android:resizeableActivity trong tệp kê khai của ứng dụng thành true. Hãy xem bài viết Hỗ trợ nhiều kích thước màn hình.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Bật hướng dọc cho tất cả các hoạt động trong gói. Trừ phi bạn bật OVERRIDE_ANY_ORIENTATION, chế độ ghi đè chỉ được dùng khi hoạt động không chỉ định hướng cố định nào khác.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Bật hướng nosensor cho tất cả các hoạt động trong gói. Trừ phi bạn bật OVERRIDE_ANY_ORIENTATION, chế độ ghi đè chỉ được dùng khi hoạt động không chỉ định hướng cố định nào khác.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Bật hướng reverseLandscape cho tất cả các hoạt động trong gói. Trừ phi bạn bật OVERRIDE_ANY_ORIENTATION, chế độ ghi đè chỉ được dùng khi hoạt động không chỉ định hướng cố định nào khác.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Giới hạn OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOROVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE để chỉ có hiệu lực khi kết nối với máy ảnh đang hoạt động.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Hạn chế để chỉ hiển thị theo hướng ngang tự nhiên khi các điều kiện sau được đáp ứng:

  • Hoạt động ở chế độ toàn màn hình
  • Thuộc tính thành phần chọn không sử dụng PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE chưa được bật
  • Nhà sản xuất thiết bị đã bật chế độ cài đặt bỏ qua yêu cầu về hướng cho màn hình
  • Hướng tự nhiên của màn hình là hướng ngang

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Bật chính sách về khả năng tương thích để bỏ qua quá trình cập nhật hướng ứng dụng để phản hồi ứng dụng gọi Activity#setRequestedOrientation() khi ứng dụng đang chạy lại hoặc có một chế độ xử lý khả năng tương thích với máy ảnh đang hoạt động.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy đặt cờ thuộc tính PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION thành true.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

Bật chính sách về khả năng tương thích nhưng bỏ qua hướng được yêu cầu của một ứng dụng để phản hồi ứng dụng gọi Activity#setRequestedOrientation() nhiều hơn hai lần trong một giây nếu một hoạt động không được tạo hiệu ứng hòm thư cho hướng cố định.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
  android:value="false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Loại trừ các gói khỏi hành vi bỏ qua yêu cầu về hướng mà nhà sản xuất thiết bị có thể bật cho một khu vực hiển thị hoặc toàn bộ màn hình.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Không chọn không sử dụng. Việc tắt chế độ ghi đè có thể nguy hiểm nếu ứng dụng không tương thích với một thiết bị đã được nhà sản xuất thiết bị bật bỏ qua chế độ cài đặt yêu cầu về hướng. Hãy liên hệ với bộ phận Quan hệ với nhà phát triển Android để tắt chế độ ghi đè.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có cờ thuộc tính nào cho chế độ ghi đè này.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

NEVER_SANDBOX_DISPLAY_APIS

Buộc các gói không bao giờ áp dụng hộp cát API Display cho một hoạt động ở chế độ hòm thư hoặc tương thích với kích thước. Các API Display tiếp tục cung cấp những giới hạn về khu vực hiển thị.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Khai báo các hoạt động có thể đổi kích thước bằng cách đặt thuộc tính tệp kê khai android:resizeableActivity thành true hoặc cờ siêu dữ liệu android.supports_size_changes thành true.

Cách tối ưu hoá ứng dụng

Những ứng dụng khai báo là hoàn toàn có thể đổi kích thước phải tuyệt đối không dựa vào kích thước hiển thị để định vị các phần tử trên giao diện người dùng. Di chuyển ứng dụng của bạn sang các API mới nhất cung cấp WindowMetrics. Nếu bạn đang dùng Jetpack Compose, hãy tận dụng WindowSizeClass API để vẽ giao diện người dùng dựa trên diện tích màn hình mà ứng dụng có trên màn hình hiện tại. Hãy xem phần Sử dụng các lớp kích thước cửa sổ.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Không chọn không sử dụng. Di chuyển từ các API không dùng nữa.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có cờ thuộc tính nào cho chế độ ghi đè này.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

ALWAYS_SANDBOX_DISPLAY_APIS

Buộc các gói luôn áp dụng hộp cát API Display bất kể chế độ kết xuất cửa sổ hiện tại. Các API Display luôn cung cấp các giới hạn đối với ứng dụng.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Khai báo các hoạt động không thể đổi kích thước bằng cách đặt thuộc tính android:resizeableActivity thành false hoặc cờ siêu dữ liệu android.supports_size_changes thành false.

Cách tối ưu hoá ứng dụng

Những ứng dụng tuyên bố là hoàn toàn có thể đổi kích thước phải tuyệt đối không dựa vào kích thước màn hình để đặt vị trí cho các phần tử trên giao diện người dùng. Hãy di chuyển ứng dụng của bạn từ các API không dùng nữa sang các API mới nhất cung cấp WindowMetrics. Hãy xem WindowMetricsCalculator.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Không chọn không sử dụng. Di chuyển từ các API không dùng nữa.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có cờ thuộc tính nào cho chế độ ghi đè này.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Buộc các gói tạo hộp cát cho các API View sau đây đối với giới hạn hoạt động:

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Giải quyết vấn đề trong mã xử lý ứng dụng bằng cách dùng các API cung cấp những giới hạn của cửa sổ ứng dụng và độ lệch tương ứng với cửa sổ ứng dụng thay vì các giới hạn của màn hình thiết bị và độ lệch tương ứng với màn hình thiết bị.

Cách tối ưu hoá ứng dụng

Ứng dụng phải dùng các API View, có tính đến khả năng tạo hiệu ứng hòm thư và chế độ nhiều cửa sổ được áp dụng cho ứng dụng. Hãy xem WindowMetricsCalculator.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
  android:value="false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Tắt tính năng buộc xoay. Cải thiện trải nghiệm người dùng trên một số ứng dụng.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION thành false.

Cách tối ưu hoá ứng dụng

Đừng dựa vào hướng cảm biến của máy ảnh được lưu vào bộ nhớ đệm hoặc thông tin thiết bị. Để biết hướng dẫn về khả năng tương thích với máy ảnh, hãy xem bài viết Giới thiệu về kính ngắm của máy ảnhHỗ trợ các nền tảng có thể đổi kích thước trong ứng dụng máy ảnh.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION thành true.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để loại bỏ tính năng buộc xoay:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Cách loại bỏ chế độ ghi đè để cho phép thực hiện buộc xoay:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Tắt chế độ làm mới hoạt động sau khi buộc xoay. Cải thiện trải nghiệm người dùng khi chế độ làm mới khiến trạng thái bị mất trong các ứng dụng.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH thành false.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH thành true.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để xoá chế độ làm mới hoạt động:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Cách xoá chế độ ghi đè để cho phép chế độ làm mới hoạt động:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Tạo các gói được áp dụng lệnh này để làm mới hoạt động bằng chu kỳ onResume()onPause()onResume() thay vì chu kỳ onResume()onStop()onResume() sau khi buộc xoay để tương thích với máy ảnh.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE thành true.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Buộc cắt đầu ra của máy ảnh theo hướng đối diện khi hướng dọc của máy ảnh không phù hợp với hướng tự nhiên của thiết bị. Nhiều ứng dụng không xử lý trường hợp này và hiện hình ảnh bị kéo giãn.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy đặt cờ thuộc tính PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT thành true.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để áp dụng tính năng cắt trường nhìn bên trong của camera trước:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Cách xoá chế độ ghi đè để xoá tính năng cắt trường nhìn bên trong của camera trước:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Ngăn ứng dụng chọn không chia sẻ màn hình ứng dụng (xem phần Chiếu nội dung nghe nhìn). Được triển khai khi các ứng dụng sử dụng sai API createConfigForDefaultDisplay() để buộc chụp toàn màn hình và gây nguy hiểm cho quyền riêng tư của người dùng bằng cách hiển thị nội dung thông báo (nội dung được chụp ở chế độ toàn màn hình chứ không phải tính năng chia sẻ màn hình ứng dụng) và tất cả các ứng dụng bất kể chế độ cửa sổ.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Cho phép hành vi chiếu nội dung đa phương tiện mặc định (được triển khai trong Android 14, API cấp 34, với createScreenCaptureIntent()), cho phép người dùng quyết định có chia sẻ toàn màn hình hay một cửa sổ ứng dụng hay không, bất kể chế độ cửa sổ. Hoặc gọi createScreenCaptureIntent(MediaProjectionConfig) bằng đối số MediaProjectionConfig được trả về từ lệnh gọi đến createConfigForUserChoice().

Cách tối ưu hoá ứng dụng

Cho phép người dùng chọn chia sẻ toàn bộ màn hình thiết bị hoặc một cửa sổ ứng dụng trong khi chiếu nội dung đa phương tiện. Kể từ Android 14 là hành vi mặc định.

Cho phép ứng dụng đổi kích thước (resizeableActivity="true") để hỗ trợ chế độ nhiều cửa sổ.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Do tính nghiêm trọng của quyền riêng tư của người dùng, ứng dụng của bạn không thể tắt hoặc chọn không sử dụng chế độ ghi đè này.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để huỷ chế độ chọn không chia sẻ một phần màn hình của ứng dụng (nghĩa là bật tính năng chia sẻ màn hình một phần):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Cách xoá chế độ ghi đè để cho phép ứng dụng chọn không chia sẻ một phần màn hình:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Cho phép gửi tiêu điểm giả cho các ứng dụng không có tiêu điểm ở chế độ chia đôi màn hình. Một số công cụ phát triển trò chơi chờ lấy tiêu điểm rồi mới vẽ nội dung của ứng dụng. Do đó, tiêu điểm giả giúp các ứng dụng tránh bị bôi đen khi chúng được tiếp tục và chưa có tiêu điểm.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Thiết lập cờ thuộc tính PROPERTY_COMPAT_ENABLE_FAKE_FOCUS thành true.

Cách tối ưu hoá ứng dụng

Bạn có thể tránh vấn đề này nếu ứng dụng của bạn xử lý tốt nhiều hướng và các thay đổi về cấu hình. Hãy tuân thủ nguyên tắc về Chất lượng ứng dụng có màn hình lớn để màn hình lớn của ứng dụng luôn sẵn sàng hoạt động.

Nếu bạn chạy công cụ phát triển trò chơi Unity, hãy nâng cấp lên phiên bản 2019.4.40 trở lên rồi xuất lại trò chơi của bạn. Giữ nguyên lựa chọn Resizable Window trong phần cài đặt Trình phát Android.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ENABLE_FAKE_FOCUS thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

Tài nguyên khác