Tạo ứng dụng dùng khi đỗ xe dành cho Android Automotive OS

Ngoài việc hỗ trợ các ứng dụng dùng khi lái xe, Android Automotive OS còn hỗ trợ các ứng dụng trình duyệt, ứng dụng trò chơi và ứng dụng video để dùng khi đỗ xe. Chỉ cần một vài thay đổi nhỏ là bạn đã có thể gửi cùng một ứng dụng đến ô tô giống như cách bạn gửi tới các thiết bị có màn hình lớn.

Kiểm thử ứng dụng hiện có trên một 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 Android Automotive OS, ứng dụng của bạn phải có một số mục nhập tệp kê khai. Nhờ những mục nhập này, bạn có thể gửi các ứng dụng dành cho Android Automotive OS đến Cửa hàng Play thông qua một loại bản phát hành dành riêng cho Automotive OS. Các ứng dụng sẽ trải qua một quy trình xem xét thủ công nhằm đảm bảo an toàn khi sử dụng trong ô tô. Hãy xem bài viết Phân phối ứng dụng Android dành cho ô tô để biết thêm chi tiết.

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

Để xuất hiện trong Cửa hàng Play trên ô tô, các ứng dụng dành riêng cho Android Automotive OS phải bao gồm phần tử <uses-feature> sau đây trong tệp AndroidManifest.xml:

<manifest ...>
    ...
    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />
    ...
</manifest>

Các ứng dụng được gửi đến những kênh phát hành không dành cho ô tô sẽ không khai báo được phần tử <uses-feature> trong mã mẫu nêu trên vì những phần tử này không thể phụ thuộc vào phần cứng dành riêng cho ô tô. Vì vậy, để đưa cùng một ứng dụng vào cả thiết bị trên ô tô lẫn thiết bị không phải trên ô tô, bạn cần tạo ít nhất 2 phiên bản ứng dụng: một phiên bản dành cho thiết bị trên ô tô và một phiên bản dành cho thiết bị di động. Để biết thêm thông tin về cách tạo các phiên bản riêng biệt này, hãy tham khảo tài liệu sau:

Hai phiên bản ứng dụng có thể trùng tên gói, nhưng phải có mã phiên bản khác nhau vì những phiên bản này sẽ được tải lên các kênh phát hành trên Cửa hàng Play một cách riêng biệt.

Ngoài ra, thay vì sử dụng các phiên bản riêng biệt, bạn có thể dùng tên gói riêng đối với tệp APK hoặc Gói ứng dụng dành cho thiết bị di động và ô tô. Để tìm hiểu ưu và nhược điểm của từng phương thức, hãy tham khảo phần Tên gói trong hướng dẫn cho nhà phát triển ứng dụng nghe nhìn.

Ngoài những phần tử xuất hiện trong mã mẫu nêu trên, các ứng dụng dành riêng cho Android Automotive OS phải có những phần tử <uses-feature> sau đây trong phần tử <manifest> gốc:

<uses-feature
  android:name="android.hardware.wifi"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.portrait"
  android:required="false"/>
<uses-feature
  android:name="android.hardware.screen.landscape"
  android:required="false"/>

Việc đặt rõ ràng các tính năng này thành không bắt buộc sẽ giúp đảm bảo rằng ứng dụng không xung đột với các tính năng phần cứng có sẵn trên thiết bị chạy Android Automotive OS.

Đả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"/>

Khi 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. 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.

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, hãy lưu ý những điều sau khi tạo ứng dụng cho Android Automotive OS.

Tối ưu hoá cho màn hình lớn

Màn hình trên ô tô chạy Android Automotive OS có kích thước, độ phân giải và tỷ lệ khung hình giống với máy tính bảng và thiết bị có thể gập lại hơn so với điện thoại. Do đó, việc tối ưu hoá ứng dụng của bạn cho màn hình lớn cũng sẽ mang lại lợi ích cho người dùng trên ô tô.

Cụ thể, hãy xem hướng dẫn Hỗ trợ nhiều kích thước màn hìnhDi chuyển giao diện người dùng sang bố cục thích ứng để biết thông tin chi tiết về cách khai thác tối đa các kích thước màn hình lớn cũng như thư viện nội dung nghe nhìntrò chơi để được hướng dẫn và có thêm cảm hứng thiết kế.

Các tính năng tối ưu hoá cho màn hình lớn khác (chẳng hạn như khả năng tương thích với thiết bị đầu vào) không trực tiếp mang lại lợi ích cho Android Automotive OS, nhưng vẫn có thể cải thiện trải nghiệm người dùng. Chẳng hạn như tính năng điều hướng bằng bàn phím tận dụng các API tương tự như tính năng điều hướng xoay, vậy nên mọi chế độ tối ưu hoá được thực hiện ở đó đều có thể mang lại lợi ích cho cả hai kiểu dáng này.

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. Mặc dù không bao giờ được đề xuất, nhưng các giá trị khoảng đệm được mã hoá cứng có thể giữ nội dung trong vùng an toàn trên những thiết bị khác có thể sẽ không có mặt trong ô tô.

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 đ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.

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.

Phân phối ứng dụng

Sau khi kiểm thử ứng dụng theo nguyên tắc về chất lượng ứng dụng trên ô tô cho danh mục của ứng dụng và tạo một bản dựng cho Android Automotive OS cùng mọi thay đổi cần thiết cho danh mục của ứng dụng đó, thì bạn có thể xuất bản ứng dụng lên các kênh dành cho hệ số hình dạng sử dụng Automotive OS trên Cửa hàng Play. Hãy xem bài viết Phân phối ứng dụng Android dành cho ô tô để biết thêm thông tin chi tiết về quy trình xuất bản.

Phản hồi về ứng dụng đỗ xe

Nếu gặp lỗi hoặc có yêu cầu về tính năng trong khi phát triển ứng dụng đỗ xe cho Android Automotive OS, thì bạn có thể báo cáo lỗi đó bằng Công cụ theo dõi lỗi của Google. Hãy nhớ điền tất cả thông tin được yêu cầu vào mẫu báo cáo lỗi. Trước khi báo lỗi mới, hãy kiểm tra xem lỗi đó đã được báo cáo trong danh sách lỗi hay chưa. Bạn có thể đăng ký theo dõi và bình chọn cho các lỗi bằng cách nhấp vào dấu sao cho một lỗi trong công cụ theo dõi. Để biết thêm thông tin, hãy xem bài viết Đăng ký theo dõi lỗi.

Báo lỗi mới