Thêm tính năng hỗ trợ Android Automotive OS vào ứng dụng dùng khi đỗ xe

Khi phân phối ứng dụng cho các thiết bị chạy Android Automotive OS, bạn cần lưu ý một số điểm riêng biệt về kiểu dáng. Hướng dẫn này giải thích những điều cần cân nhắc đó.

Kiểm thử ứng dụng hiện có của bạn trên trình mô phỏng Android Automotive OS

Để bắt đầu tạo ứng dụng cho Android Automotive OS, trước tiên, bạn nên kiểm thử ứng dụng hiện có trên một trình mô phỏng Android Automotive OS. Để thiết lập trình mô phỏng, hãy làm theo các bước trong bài viết Kiểm thử bằng trình mô phỏng Android Automotive OS. Sau đó, bạn có thể chạy ứng dụng bằng cách làm theo hướng dẫn trong phần Chạy ứng dụng trên trình mô phỏng.

Khi chạy ứng dụng, hãy chú ý đến các vấn đề về khả năng tương thích, chẳng hạn như:

  • Màn hình thông tin giải trí có các hướng cố định. Để đáp ứng nguyên tắc về chất lượng của ứng dụng dành cho ô tô, ứng dụng phải hỗ trợ cả hướng dọc và hướng ngang.
  • Các API hoạt động trên những thiết bị khác có thể không được hỗ trợ trên Android Automotive OS. Ví dụ: một số API của Dịch vụ Google Play không được hỗ trợ trên Android Automotive OS. Hãy xem phần Tắt các tính năng để biết thông tin chi tiết về cách xử lý những vấn đề này.

Định cấu hình tệp kê khai của ứng dụng

Để nhắm đến các thiết bị Android Automotive OS, ứng dụng của bạn phải có một số mục nhập tệp kê khai. Sau khi bạn chọn phân phối ứng dụng cho các thiết bị chạy Android Automotive OS, các ứng dụng tương thích sẽ trải qua một quy trình xem xét thủ công để đảm bảo an toàn khi sử dụng trong ô tô. Hãy xem phần Phân phối cho ô tô để biết thêm thông tin chi tiết.

Các tính năng bắt buộc của Android Automotive OS

Tất cả ứng dụng được tạo cho Android Automotive OS đều phải đáp ứng một số yêu cầu nhất định thì mới có thể phân phối qua Google Play. Hãy xem phần Đáp ứng các yêu cầu về tính năng của Google Play để biết thêm thông tin.

Đảm bảo rằng không có hoạt động nào được tối ưu hoá để chống phân tâm

Để đảm bảo ứng dụng của bạn chỉ dùng được trong khi đỗ xe, bạn không được thêm phần tử <meta-data> sau đây vào bất kỳ phần tử <activity> nào trong tệp kê khai:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Nếu không có siêu dữ liệu này, hệ điều hành sẽ tự động chặn các hoạt động trong ứng dụng của bạn khi ô tô chuyển sang chế độ lái xe để giảm sự phân tâm cho người lái xe và chuyển sang trạng thái vòng đời Tạm dừng. Quá trình này diễn ra dưới dạng một phương thức gọi lại trong vòng đời onPause(), khi đó, bạn phải tạm dừng cả việc phát video lẫn âm thanh qua ứng dụng.

Trên các thiết bị có chế độ tương thích với Android Automotive OS, việc chặn hệ thống sẽ khiến các hoạt động của ứng dụng chuyển đổi từ trạng thái Tạm dừng sang trạng thái Đã dừng. Để xác minh rằng ứng dụng của bạn tạm dừng phát trên tất cả thiết bị chứ không chỉ những thiết bị hỗ trợ chế độ tương thích, hãy nhớ kiểm thử trên một thiết bị không có chế độ tương thích. Hãy xem bài viết Kiểm thử bằng trình mô phỏng Android Automotive OS để biết thông tin về những trình mô phỏng có hoặc không có chế độ tương thích.

Mục nhập tệp kê khai theo danh mục

Ngoài các yêu cầu trước đó áp dụng cho tất cả ứng dụng ở chế độ đỗ, các danh mục video và trò chơi còn có các yêu cầu bổ sung:

Tối ưu hoá ứng dụng cho Android Automotive OS

Để mang lại trải nghiệm tốt nhất có thể cho người dùng trên ô tô, hãy lưu ý những điều sau khi tạo ứng dụng cho Android Automotive OS:

Thao tác với các phần lồng ghép cửa sổ và vết cắt trên màn hình

Cũng giống như các kiểu dáng khác, Android Automotive OS có các phần tử trên giao diện người dùng hệ thống, chẳng hạn như thanh trạng thái và thanh điều hướng, đồng thời hỗ trợ các loại màn hình không phải hình chữ nhật.

Theo mặc định, các ứng dụng sẽ vẽ trong một vùng không chồng chéo với thanh hệ thống hoặc vết cắt trên màn hình. Tuy nhiên, bạn nên để ứng dụng của mình ẩn thanh hệ thống, vẽ nội dung phía sau thanh hệ thống, hoặc cho thấy nội dung ở vết cắt trên màn hình như mô tả trong phần Bố trí ứng dụng của bạn trong các phần lồng ghép cửa sổ. Nếu ứng dụng của bạn có bất cứ hoạt động nào như trên, hãy tham khảo các mục sau để biết thông tin cụ thể về cách giúp ứng dụng hoạt động hiệu quả trên hệ sinh thái của thiết bị chạy Android Automotive OS.

Thanh hệ thống, chế độ hiển thị tối đa và hiển thị tràn viền

Thanh hệ thống trong ô tô có thể có kích thước và vị trí khác với các kiểu dáng thiết bị khác. Ví dụ: bạn có thể bố trí thanh điều hướng ở bên trái, bên phải hoặc cuối màn hình. Ngay cả trong trường hợp thanh trạng thái ở trên cùng và thanh điều hướng ở dưới cùng (như hầu hết điện thoại và máy tính bảng), có thể kích thước của các thành phần này trong ô tô sẽ lớn hơn nhiều.

Ngoài ra, Android Automotive OS cho phép Nhà sản xuất thiết bị gốc (OEM) kiểm soát việc ứng dụng có thể hiện hoặc ẩn thanh hệ thống để vào và thoát chế độ hiển thị tối đa. Ví dụ: bằng cách ngăn các ứng dụng ẩn thanh hệ thống, OEM có thể đảm bảo luôn truy cập được các chế độ điều khiển xe (chẳng hạn như chế độ kiểm soát nhiệt độ và độ ẩm) trên màn hình. Nếu OEM đã ngăn ứng dụng kiểm soát thanh hệ thống, thì sẽ không có gì xảy ra khi ứng dụng gọi API WindowInsetsController (hoặcWindowInsetsControllerCompat) để làm hiện hoặc ẩn thanh hệ thống. Hãy tham khảo tài liệu về showhide để tìm hiểu thêm về cách phát hiện xem ứng dụng của bạn có thể sửa đổi các phần lồng ghép hay không.

Tương tự, OEM cũng có thể kiểm soát việc ứng dụng có thể thiết lập màu và độ mờ của thanh hệ thống hay không để đảm bảo luôn có thể nhìn rõ các thanh cũng như phần tử chứa trong đó. Nếu ứng dụng của bạn vẽ tràn viền, hãy kiểm tra để đảm bảo rằng chỉ có nội dung không quan trọng được vẽ sau thanh hệ thống. Nội dung này có thể không xuất hiện nếu OEM của thiết bị ngăn việc thiết lập màu sắc hoặc độ mờ của các thanh.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Nếu ứng dụng của bạn có nội dung tràn viền, đừng giả định về kích thước, số lượng, loại hoặc vị trí của các thanh hệ thống. Thay vào đó, hãy sử dụng các API phần lồng ghép cửa sổ để bố trí nội dung ứng dụng tương ứng với thanh hệ thống. Xem phần Hiển thị nội dung tràn viền trong ứng dụng của bạn để biết thêm thông tin cụ thể về cách sử dụng các API này. Bạn không bao giờ nên sử dụng các giá trị khoảng đệm được mã hoá cứng cho bất kỳ kiểu dáng nào, nhưng trong ô tô, các giá trị này có thể sẽ không hoạt động để giữ nội dung trong vùng an toàn.

Thích ứng với màn hình có hình dạng không đều

Ngoài màn hình hình chữ nhật, có thể một số ô tô sẽ có màn hình có hình dạng không đều, chẳng hạn như trong Hình 1:

Sơ đồ về một thiết bị chạy Android Automotive OS với màn hình cong về phía bên phải.
Hình 1: Một thiết bị chạy Android Automotive OS có màn hình cong về phía bên phải. Vùng màu xanh lục là hình chữ nhật an toàn không chồng chéo với hộp giới hạn của vết cắt trên màn hình của phần cong.

Nếu ứng dụng của bạn không hiển thị tràn viền, thì bạn không cần làm gì để ứng dụng hiển thị trong vùng an toàn.

Nếu ứng dụng của bạn hiển thị tràn viền, bạn có thể chọn cách mà mình muốn ứng dụng xử lý các vết cắt trên màn hình. Bạn có thể thực hiện việc này bằng cách sử dụng tệp tài nguyên, hãy thiết lập thuộc tính android:windowLayoutInDisplayCutoutMode cho giao diện của ứng dụng hoặc trong thời gian chạy bằng cách sửa đổi thuộc tính layoutInDisplayCutoutMode của cửa sổ.

Vì các loại vết cắt trên màn hình trên thiết bị Android Automotive OS khác với trên thiết bị di động, bạn không nên sử dụng LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT hoặc LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES (được tối ưu hoá hành vi cho các vết cắt phát hiện thấy trên thiết bị di động). Hãy chuyển sang sử dụng LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER hoặc LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS để luôn tránh hoặc luôn nhập vết cắt. Khi chọn phần tiếp theo, hãy xem phần Hỗ trợ vết cắt trên màn hình để biết thêm thông tin cụ thể về các API liên quan đến vết cắt trên màn hình.

Nếu ứng dụng của bạn hiển thị vào vùng vết cắt trên màn hình và bạn muốn có hành vi khác giữa Android Automotive OS và thiết bị di động, hãy xem phần Tắt các tính năng để được hướng dẫn trong trường hợp ứng dụng thiết lập hành vi này trong thời gian chạy và xem phần Dùng tài nguyên thay thế nếu ứng dụng của bạn thiết lập hành vi này bằng cách sử dụng tệp tài nguyên.

Tắt các tính năng

Nếu bạn đang thiết kế để ứng dụng di động hiện có dùng được trên Android Automotive OS, thì một số tính năng và chức năng có thể không phù hợp hoặc không được hỗ trợ. Ví dụ: ô tô thường không cấp quyền truy cập vào camera. Ngoài ra, Android Automotive OS chỉ hỗ trợ một số Dịch vụ Google Play. Hãy xem bài viết Dịch vụ Google Play dành cho ô tô để biết thêm chi tiết.

Bạn có thể dùng API PackageManager.hasSystemFeature để xem ứng dụng có đang chạy trên Android Automotive OS hay không bằng cách kiểm tra để tìm tính năng FEATURE_AUTOMOTIVE, như trong ví dụ sau:

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Ngoài ra, nếu ứng dụng của bạn cũng có thành phần Android Auto, thì bạn có thể dùng API CarConnection trên Thư viện ứng dụng Android cho Ô tô để xem ứng dụng có đang chạy trên Android Automotive OS, Android Auto hay hoàn toàn không kết nối với ô tô hay không.

Đối với tính năng Hình trong hình (PiP), hãy làm theo các phương pháp hay nhất đã thiết lập để kiểm tra xem tính năng đó có dùng được và phản hồi bình thường hay không.

Xử lý tình huống không có mạng

Mặc dù ngày càng nhiều ô tô kết nối được Internet, nhưng các ứng dụng nên xử lý tình huống mà không cần đến kết nối Internet, chẳng hạn như trong các trường hợp sau:

  • Có thể người dùng chọn không sử dụng dữ liệu di động được cung cấp trong gói thuê bao của nhà sản xuất ô tô.
  • Có thể quyền truy cập vào dữ liệu di động bị hạn chế ở một số khu vực.
  • Ô tô có sóng Wi-Fi có thể nằm ngoài phạm vi Wi-Fi hoặc nhà sản xuất thiết bị gốc có thể tắt Wi-Fi để ưu tiên dùng mạng di động.

Hãy chuẩn bị để xử lý những tình huống này trong ứng dụng của bạn bằng cách xuống cấp nhẹ chức năng phụ thuộc vào quyền truy cập Internet, chẳng hạn như cung cấp nội dung ngoại tuyến. Để biết thêm thông tin, hãy xem các phương pháp hay nhất để tối ưu hoá hoạt động nối mạng.

Sử dụng tài nguyên thay thế

Để giúp điều chỉnh ứng dụng cho phù hợp với ô tô, bạn có thể sử dụng bộ hạn định tài nguyên car để cung cấp tài nguyên thay thế khi chạy trên xe chạy Android Automotive OS. Ví dụ: nếu sử dụng Tài nguyên kích thước để lưu trữ giá trị khoảng đệm, thì bạn có thể sử dụng giá trị lớn hơn cho nhóm tài nguyên car để tăng kích thước của đích chạm.