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 thiết bị chạy Android Automotive OS, bạn cần lưu ý một số điểm riêng biệt đối với kiểu dáng thiết bị. Hướng dẫn này giải thích những điểm cần lưu ý đó.

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

Để hoạt động được trên thiết bị chạy 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 cho thiết bị chạy Android Automotive OS, Google Play sẽ xem xét các ứng dụng tương thích để đảm bảo rằng các ứng dụng đó an toàn khi sử dụng trong ô tô. Hãy xem bài viết 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 xây dựng cho Android Automotive OS phải đáp ứng một số yêu cầu nhất định để được phân phối bằng Google Play. Hãy xem bài viết Đá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ụ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 đỗ xe, danh mục video và trò chơi còn có các yêu cầu khác:

Đáp ứng các yêu cầu về sự phân tâm của người lái xe

Việc tránh để người lái xe bị phân tâm là rất quan trọng khi bạn đưa ứng dụng của mình vào ô tô. Đối với các ứng dụng đỗ xe, điều này chủ yếu được thực hiện bằng cách ngăn ứng dụng của bạn được sử dụng hoặc phát âm thanh trong khi các quy định hạn chế về trải nghiệm người dùng (UX) đang có hiệu lực, như được nêu trong nguyên tắc về chất lượng DD-2DD-3.

Ngăn sử dụng trong khi các quy định hạn chế về trải nghiệm người dùng đang có hiệu lực

Theo mặc định, bạn không thể sử dụng hoặc khởi chạy các hoạt động trong khi các quy định hạn chế về trải nghiệm người dùng đang có hiệu lực. Để đảm bảo hành vi này áp dụng cho ứng dụng của bạn, ứng dụng đó không được chứa phần tử <meta-data> sau đây trong 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 một hoạt động trong ứng dụng của bạn ở trạng thái Đã tiếp tục khi các quy định hạn chế về trải nghiệm người dùng bắt đầu có hiệu lực, thì hoạt động đó sẽ bị che khuất bởi một hoạt động do hệ điều hành sở hữu.

Ở mức tối thiểu, hoạt động của ứng dụng sẽ 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 , khi chặn hệ thống, các hoạt động của ứng dụng sẽ chuyển từ trạng thái Đã tạm dừng sang trạng thái Đã dừng.

Dừng phát và ngăn tiếp tục phát

Đối với một số ứng dụng, việc tạm dừng phát trong onPause() và theo dõi trạng thái để ngăn tiếp tục phát cho đến khi onResume() là đủ để đáp ứng các yêu cầu về sự phân tâm của người lái xe.

Nếu việc phản hồi các phương thức gọi lại trong vòng đời là không đủ cho ứng dụng của bạn, thì bạn có thể trực tiếp theo dõi trạng thái hạn chế về trải nghiệm người dùng như mô tả trong phần sau. Ví dụ: các ứng dụng hỗ trợ tính năng hình trong hình có thể muốn theo dõi trực tiếp thay vì kiểm tra có điều kiện trong các phương thức gọi lại trong vòng đời.

Theo dõi các quy định hạn chế về trải nghiệm người dùng

Để theo dõi các quy định hạn chế về trải nghiệm người dùng, trước tiên, hãy thêm phần phụ thuộc vào thư viện android.car trong tệp build.gradle của mô-đun ứng dụng. Đây là một tiện ích cho SDK Android cung cấp các API dành riêng cho Android Automotive OS.

android {
    ...
    useLibrary("android.car")
}

Sử dụng CarUxRestrictionsManager để đọc trạng thái hạn chế về trải nghiệm người dùng. Đừng cố gắng xác định trạng thái hạn chế về trải nghiệm người dùng từ trạng thái phần cứng khác, chẳng hạn như số hoặc tốc độ, vì các quy định hạn chế về trải nghiệm người dùng có thể khác nhau giữa các màn hình trong một chiếc xe.

val car = Car.createCar(context) ?: return
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions ->
    // Handle UX restrictions
}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

Giá trị duy nhất do CarUxRestrictions cung cấp mà ứng dụng của bạn tham chiếu là giá trị trả về của isRequiresDistractionOptimization. Các giá trị khác chỉ phù hợp với các hoạt động được đánh dấu là tối ưu hoá sự phân tâm.

Kiểm thử kết quả triển khai

Xác thực rằng ứng dụng của bạn đáp ứng các yêu cầu về sự phân tâm của người lái xe bằng quy trình sau:

  1. Cài đặt ứng dụng của bạn trên một hình ảnh hệ thống không có Cửa hàng Google Play hoặc Chế độ tương thích.
  2. Khi lưới ứng dụng trình chạy đang mở, hãy mô phỏng việc lái xe và xác minh rằng bạn không thể mở ứng dụng của mình.
  3. Dừng mô phỏng việc lái xe và mở ứng dụng của bạn đến màn hình phát rồi bắt đầu phát.
  4. Mô phỏng việc lái xe một lần nữa và xác minh rằng quá trình phát sẽ tạm dừng.
    1. Nếu ứng dụng của bạn hỗ trợ tích hợp với MediaSession, hãy sử dụng adb shell cmd media_session dispatch play và xác minh rằng quá trình phát không tiếp tục.

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

Để mang đến cho người dùng trải nghiệm tốt nhất có thể trong ô tô, hãy lưu ý những điều sau đây khi xây dựng ứ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 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 thiết bị 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:

Một thiết bị chạy Android Automotive OS có 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 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à Dùng tài nguyên thay thế nếu ứng dụng 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 PackageManager.hasSystemFeature API để 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:

val 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 CarConnection API trên Thư viện ứng dụng Android cho Ô tô để xem ứng dụng đang chạy trên Android Automotive OS, Android Auto hay hoàn toàn không kết nối với ô tô.

Đố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.

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.