Thêm khả năng hỗ trợ Android Automotive OS vào ứng dụng đa phương tiện

Android Automotive OS cho phép người dùng cài đặt ứng dụng trong ô tô. Để tiếp cận người dùng trên nền tảng này, bạn cần phân phối một ứng dụng được tối ưu hoá cho người lái và tương thích với Android Automotive OS. Bạn có thể sử dụng lại hầu hết đoạn mã và tài nguyên trong ứng dụng Android Auto của mình. Tuy nhiên, bạn cần tạo riêng một bản dựng đáp ứng những yêu cầu trên trang này.

Tổng quan về quá trình phát triển

Để thêm khả năng hỗ trợ Android Automotive OS, bạn chỉ cần thực hiện một vài bước theo mô tả trong các phần dưới đây:

  1. Bật các tính năng dành cho ô tô trong Android Studio
  2. Tạo mô-đun cho ô tô.
  3. Cập nhật phần phụ thuộc Gradle.
  4. Triển khai hoạt động cài đặt và đăng nhập (không bắt buộc)
  5. Đọc gợi ý về máy chủ nội dung nghe nhìn (không bắt buộc).

Cân nhắc về thiết kế

Android Automotive OS sắp xếp nội dung đa phương tiện mà ứng dụng nhận được từ dịch vụ trình duyệt nội dung đa phương tiện của ứng dụng. Tức là ứng dụng sẽ không vẽ lại giao diện người dùng hay khởi chạy hoạt động nào khi người dùng kích hoạt chế độ phát nội dung đa phương tiện.

Nếu bạn đang triển khai hoạt động cài đặt hoặc đăng nhập, thì các hoạt động này phải được tối ưu hoá cho xe. Hãy tham khảo Nguyên tắc thiết kế dành cho Android Automotive OS khi thiết kế những phần như vậy trong ứng dụng.

Thiết lập dự án

Bạn cần thiết lập một số phần trong dự án của ứng dụng để có thể hỗ trợ Android Automotive OS.

Bật các tính năng dành cho ô tô trong Android Studio

Sử dụng phiên bản Android Studio 4.0 trở lên để đảm bảo rằng tất cả các tính năng của Automotive OS đều được bật.

Tạo mô-đun ô tô

Một số thành phần của Android Automotive OS (chẳng hạn như tệp kê khai) có những yêu cầu riêng tuỳ theo nền tảng. Hãy tạo một mô-đun có thể tách biệt đoạn mã cho các thành phần này với đoạn mã khác trong dự án của bạn (ví dụ như đoạn mã dùng trong ứng dụng dành cho điện thoại).

Làm theo các bước sau để thêm mô-đun ô tô vào dự án:

  1. Trong Android Studio, hãy nhấp vào File > New > New Module (Tệp > Mới > Mô-đun mới).
  2. Chọn Automotive Module (Mô-đun Automotive), rồi nhấp vào Next (Tiếp theo).
  3. Nhập Application/Library name (Tên thư viện/ứng dụng). Đây là tên ứng dụng mà người dùng sẽ nhìn thấy trên Android Automotive OS.
  4. Nhập Module name (Tên mô-đun).
  5. Điều chỉnh Package name (Tên gói) cho phù hợp với ứng dụng.
  6. Chọn API 28: Android 9.0 (Pie) cho Minimum SDK (SDK tối thiểu), sau đó nhấp vào Next (Tiếp theo).

    Mọi ô tô hỗ trợ Android Automotive OS đều chạy trên Android 9 (API cấp 28) trở lên. Vì vậy, việc chọn giá trị này sẽ nhắm đến mọi ô tô tương thích.

  7. Chọn No Activity (Không có hoạt động) rồi nhấp vào Finish (Hoàn tất).

Sau khi tạo mô-đun trong Android Studio, hãy mở AndroidManifest.xml trong mô-đun ô tô mới:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

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

</manifest>

Phần tử application chứa một số thông tin tiêu chuẩn về ứng dụng cùng một phần tử uses-feature khai báo việc hỗ trợ Android Automotive OS. Lưu ý rằng không có hoạt động nào được khai báo trong tệp kê khai.

Nếu bạn triển khai một hoạt động cài đặt hoặc đăng nhập, hãy thêm những hoạt động đó vào đây. Các hoạt động này là các hoạt động duy nhất cần khai báo trong tệp kê khai cho ứng dụng trên Android Automotive OS, được hệ thống kích hoạt bằng cách sử dụng ý định tường minh.

Sau khi thêm hoạt động cài đặt hoặc đăng nhập, hãy hoàn thiện tệp kê khai bằng cách thiết lập thuộc tính android:appCategory="audio" trong phần tử application rồi thêm các phần tử uses-feature sau:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:appCategory="audio"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

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

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

</manifest>

Việc thiết lập tường minh các tính năng này thành required="false" sẽ đảm bảo rằng ứng dụng của bạn không xung đột với các tính năng phần cứng hiện có trong thiết bị chạy Automotive OS.

Khai báo việc hỗ trợ nội dung đa phương tiện cho Android Automotive OS

Hãy sử dụng mục kê khai sau đây để khai báo rằng ứng dụng của bạn có hỗ trợ Android Automotive OS:

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

Mục kê khai này là một tệp XML khai báo những chức năng cho ô tô mà ứng dụng của bạn hỗ trợ.

Để biểu thị việc bạn có một ứng dụng đa phương tiện, hãy thêm tệp XML có tên automotive_app_desc.xml vào thư mục res/xml/ trong dự án. Đưa nội dung sau đây vào tệp này:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

Bộ lọc ý định

Android Automotive OS sử dụng ý định tường minh để kích hoạt các hoạt động trong ứng dụng đa phương tiện. Đừng thêm bất kỳ hoạt động nào có bộ lọc ý định CATEGORY_LAUNCHER hoặc ACTION_MAIN vào tệp kê khai.

Các hoạt động tương tự như trong ví dụ sau thường nhắm đến điện thoại hoặc một số thiết bị di động khác. Hãy khai báo các hoạt động này trong mô-đun xây dựng ứng dụng điện thoại, chứ không phải trong mô-đun xây dựng ứng dụng cho Android Automotive OS.

<activity android:name=".MyActivity">
    <intent-filter>
        <!-- You can't use either of these intents for Android Automotive OS -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!--
        In their place, you can include other intent filters for any activities
        that your app needs for Android Automotive OS, such as settings or
        sign-in activities.
        -->
    </intent-filter>
</activity>

Cập nhật phần phụ thuộc Gradle

Bạn nên đặt dịch vụ trình duyệt nội dung đa phương tiện trong một mô-đun riêng biệt mà bạn dùng chung giữa ứng dụng điện thoại và mô-đun ô tô. Nếu đang áp dụng phương pháp này, bạn cần cập nhật mô-đun ô tô của mình để thêm mô-đun dùng chung, như minh hoạ trong đoạn mã sau:

my-auto-module/build.gradle

Groovy

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

Triển khai hoạt động cài đặt và đăng nhập

Ngoài dịch vụ trình duyệt nội dung đa phương tiện, bạn cũng có thể cung cấp các hoạt động cài đặt và đăng nhập được tối ưu hoá cho xe cho ứng dụng của mình trên Android Automotive OS. Các hoạt động này cho phép bạn cung cấp chức năng của ứng dụng không có sẵn trong các API Android Media.

Chỉ triển khai các hoạt động này nếu ứng dụng trên Android Automotive OS cần cho phép người dùng đăng nhập hoặc thay đổi các chế độ cài đặt của ứng dụng. Những hoạt động này không được Android Auto sử dụng.

Quy trình hoạt động

Sơ đồ sau cho biết cách người dùng tương tác với các chế độ cài đặt và đăng nhập khi sử dụng Android Automotive OS:

Quy trình cho hoạt động Cài đặt và Đăng nhập

Hình 1. Quy trình cho hoạt động cài đặt và đăng nhập.

Ngăn các yếu tố gây sao lãng trong hoạt động cài đặt và đăng nhập của bạn

Để đảm bảo các hoạt động cài đặt và/hoặc đăng nhập của bạn chỉ sử dụng được trong khi xe của người dùng đang đỗ, hãy xác minh rằng (các) phần tử <activity> không bao gồm phần tử <meta-data> sau đây. Ứng dụng của bạn sẽ bị từ chối trong quá trình xem xét nếu có phần tử như vậy.

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

Thêm hoạt động cài đặt

Bạn có thể thêm hoạt động cài đặt được tối ưu hoá cho xe, để người dùng có thể định cấu hình các chế độ cài đặt cho ứng dụng trong ô tô của họ. Hoạt động cài đặt cũng có thể cung cấp các quy trình khác, như đăng nhập hoặc đăng xuất khỏi tài khoản của người dùng hay chuyển đổi tài khoản người dùng. Hãy nhớ rằng hoạt động này chỉ được kích hoạt bởi một ứng dụng chạy trên Android Automotive OS. Các ứng dụng điện thoại kết nối với Android Auto không sử dụng hoạt động này.

Khai báo hoạt động cài đặt

Bạn phải khai báo hoạt động cài đặt của mình trong tệp kê khai của ứng dụng, như được minh hoạ trong đoạn mã sau:

<application>
    ...
    <activity android:name=".AppSettingsActivity"
              android:exported="true"
              android:theme="@style/SettingsActivity"
              android:label="@string/app_settings_activity_title">
        <intent-filter>
            <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
        </intent-filter>
    </activity>
    ...
</application>

Triển khai hoạt động cài đặt

Khi một người dùng chạy ứng dụng, Android Automotive OS sẽ phát hiện hoạt động cài đặt mà bạn đã khai báo và hiển thị một affordance (thuộc tính), chẳng hạn như biểu tượng. Người dùng có thể nhấn hoặc chọn affordance này trên màn hình của ô tô để chuyển đến hoạt động. Android Automotive OS gửi ý định ACTION_APPLICATION_PREFERENCES để giúp ứng dụng bắt đầu hoạt động cài đặt.

Nội dung còn lại của phần này cho biết cách điều chỉnh mã trong ứng dụng mẫu Universal Android Music Player (UAMP) để triển khai hoạt động cài đặt cho ứng dụng.

Để bắt đầu, hãy tải mã mẫu xuống:

# Clone the UAMP repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

Để triển khai hoạt động, hãy làm theo các bước sau:

  1. Sao chép thư mục automotive/automotive-lib vào mô-đun ô tô.
  2. Xác định cây lựa chọn ưu tiên như trong automotive/src/main/res/xml/preferences.xml.
  3. Triển khai PreferenceFragmentCompat mà hoạt động cài đặt của bạn hiển thị. Xem các tệp SettingsFragment.ktSettingsActivity.kt trong UAMP và Hướng dẫn cài đặt Android để biết thêm thông tin.

Khi triển khai hoạt động cài đặt, hãy cân nhắc dùng các phương pháp hay nhất dưới đây trong việc sử dụng một số thành phần trong Thư viện lựa chọn ưu tiên:

  • Chỉ phân nhiều nhất 2 cấp dưới thành phần hiển thị chính trong hoạt động cài đặt.
  • Đừng sử dụng DropDownPreference. Thay vào đó hãy sử dụng ListPreference.
  • Thành phần tổ chức:
    • PreferenceScreen
      • Đây phải là cấp cao nhất trong cây tuỳ chọn.
    • PreferenceCategory
      • Thuộc tính này dùng để nhóm các đối tượng Preference lại với nhau.
      • Đưa vào một title.
  • Thêm keytitle vào tất cả thành phần dưới đây. Bạn cũng có thể thêm summary, icon hoặc cả hai:
    • Preference
      • Tuỳ chỉnh logic trong lệnh gọi onPreferenceTreeClick() của quá trình triển khai PreferenceFragmentCompat.
    • CheckBoxPreference
      • Có thể dùng summaryOn hoặc summaryOff thay cho summary đối với văn bản có điều kiện.
    • SwitchPreference
      • Có thể dùng summaryOn hoặc summaryOff thay cho summary đối với văn bản có điều kiện.
      • Có thể thiết lập switchTextOn hoặc switchTextOff.
    • SeekBarPreference
      • Bao gồm min, maxdefaultValue.
    • EditTextPreference
      • Bao gồm dialogTitle, positiveButtonTextnegativeButtonText.
      • Có thể thiết lập dialogMessage và/hoặc dialogLayoutResource.
    • com.example.android.uamp.automotive.lib.ListPreference
      • Lấy dữ liệu chủ yếu từ ListPreference
      • Dùng để hiển thị danh sách có một lựa chọn về các đối tượng Preference.
      • Phải có một mảng entriesentryValues tương ứng.
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • Chủ yếu bắt nguồn từ MultiSelectListPreference
      • Dùng để hiển thị một danh sách có nhiều lựa chọn về các đối tượng Preference.
      • Phải có một mảng entriesentryValues tương ứng.

Thêm hoạt động đăng nhập

Nếu người dùng bắt buộc phải đăng nhập để được sử dụng ứng dụng, bạn có thể thêm hoạt động đăng nhập đã tối ưu hoá cho xe để xử lý tính năng đăng nhập và đăng xuất khỏi ứng dụng. Bạn cũng có thể thêm quy trình đăng nhập và đăng xuất vào hoạt động cài đặt nhưng nếu ứng dụng đòi hỏi người dùng đăng nhập mới có thể sử dụng, hãy dùng hoạt động đăng nhập chuyên biệt. Hãy nhớ rằng hoạt động này chỉ được kích hoạt bởi ứng dụng chạy trên Android Automotive OS. Các ứng dụng điện thoại kết nối với Android Auto không sử dụng hoạt động này.

Yêu cầu đăng nhập khi khởi động ứng dụng

Để yêu cầu người dùng đăng nhập trước khi sử dụng ứng dụng, dịch vụ trình duyệt đa phương tiện phải thực hiện những việc sau:

  1. Trong phương thức onLoadChildren() của dịch vụ, hãy gửi kết quả null bằng phương thức sendResult().
  2. Đặt PlaybackStateCompat của phiên đa phương tiện thành STATE_ERROR bằng cách sử dụng phương thức setState(). Điều này cho Android Automotive OS biết rằng không thể thực hiện hoạt động nào khác cho đến khi lỗi được giải quyết.
  3. Đặt mã lỗi PlaybackStateCompat của phiên đa phương tiện thành ERROR_CODE_AUTHENTICATION_EXPIRED. Điều này cho Android Automotive OS biết rằng người dùng cần phải xác thực.
  4. Đặt thông báo lỗi PlaybackStateCompat của phiên đa phương tiện bằng phương thức setErrorMessage(). Vì thông báo lỗi này chỉ dành cho người dùng nên phải được bản địa hoá theo ngôn ngữ hiện tại của người dùng.
  5. Đặt thông tin bổ sung về PlaybackStateCompat của phiên đa phương tiện bằng phương thức setExtras(). Thêm vào hai khoá sau:

Đoạn mã sau đây giới thiệu cách để yêu cầu người dùng phải đăng nhập trước khi sử dụng ứng dụng của bạn:

Kotlin

import androidx.media.utils.MediaConstants

val signInIntent = Intent(this, SignInActivity::class.java)
val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0)
val extras = Bundle().apply {
    putString(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
        "Sign in"
    )
    putParcelable(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
        signInActivityPendingIntent
    )
}

val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
        .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
        )
        .setExtras(extras)
        .build()
mediaSession.setPlaybackState(playbackState)

Java

import androidx.media.utils.MediaConstants;

Intent signInIntent = new Intent(this, SignInActivity.class);
PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0);
Bundle extras = new Bundle();
extras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
    "Sign in");
extras.putParcelable(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
    signInActivityPendingIntent);

PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
    .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
    )
    .setExtras(extras)
    .build();
mediaSession.setPlaybackState(playbackState);

Sau khi xác thực người dùng thành công, hãy đặt PlaybackStateCompat trở lại một trạng thái khác với STATE_ERROR, sau đó đưa người dùng quay lại Android Automotive OS bằng cách gọi phương thức finish() của hoạt động đăng nhập.

Triển khai hoạt động đăng nhập

Google cung cấp nhiều công cụ nhận dạng mà bạn có thể sử dụng để giúp người dùng đăng nhập vào ứng dụng trong ô tô. Một số công cụ, chẳng hạn như Xác thực Firebase, cung cấp các bộ công cụ full-stack có thể giúp bạn xây dựng trải nghiệm xác thực tuỳ thích. Các công cụ khác tận dụng thông tin xác thực hiện có của người dùng hoặc các công nghệ khác để giúp bạn xây dựng trải nghiệm đăng nhập trơn tru cho người dùng.

Các công cụ sau đây có thể giúp bạn xây dựng trải nghiệm đăng nhập dễ dàng hơn cho những người dùng trước đó từng đăng nhập trên một thiết bị khác:

  • Đăng ký và Đăng nhập bằng một lần chạm: nếu bạn đã triển khai tính năng Một lần chạm cho các thiết bị khác (chẳng hạn như ứng dụng điện thoại), hãy triển khai tính năng này cho ứng dụng của bạn trên Android Automotive OS để hỗ trợ người dùng vốn sử dụng tính năng Một lần chạm.
  • Đăng nhập bằng Google: nếu bạn đã triển khai tính năng Đăng nhập bằng Google cho các thiết bị khác, chẳng hạn như ứng dụng điện thoại, hãy triển khai tính năng này cho ứng dụng của bạn trên Android Automotive OS để hỗ trợ người dùng vốn Đăng nhập bằng Google.
  • Tự động điền bằng Google: nếu người dùng đã sử dụng tính năng Tự động điền bằng Google trên các thiết bị Android khác thì thông tin xác thực của người dùng sẽ được lưu vào Trình quản lý mật khẩu của Google. Khi những người dùng đó đăng nhập vào ứng dụng trên Android Automotive OS, tính năng Tự động điền bằng Google sẽ đề xuất thông tin xác thực đã lưu có liên quan. Việc sử dụng tính năng Tự động điền bằng Google không đòi hỏi nhà phát triển ứng dụng tốn nhiều công sức. Tuy nhiên, nhà phát triển ứng dụng có thể tối ưu hoá ứng dụng để có được chất lượng tốt hơn. Tính năng Tự động điền bằng Google được hỗ trợ trên tất cả thiết bị chạy Android 8.0 (API cấp 26) trở lên, bao gồm cả Android Automotive OS.

Sử dụng AccountManager

Các ứng dụng trên Android Automotive OS có xác thực phải sử dụng AccountManager vì những lý do sau:

  • Trải nghiệm người dùng tốt hơn và dễ dàng quản lý tài khoản: người dùng có thể dễ dàng quản lý tất cả tài khoản của họ trên trình đơn tài khoản trong phần cài đặt hệ thống, bao gồm cả hoạt động đăng nhập và đăng xuất.
  • Trải nghiệm dành cho "khách": ô tô là thiết bị dùng chung, nghĩa là OEM (Nhà sản xuất thiết bị gốc) có thể bật trải nghiệm "khách" trong xe nhằm ngăn việc thêm tài khoản. Bạn có thể thiết lập chế độ hạn chế này bằng cách sử dụng DISALLOW_MODIFY_ACCOUNTS cho AccountManager.

Quyền

Nếu bạn cần yêu cầu người dùng cấp quyền, hãy sử dụng quy trình tương tự như hoạt động xác thực hoặc hoạt động cài đặt trong sơ đồ quy trình hoạt động trình bày ở phần trước.

Đọc gợi ý về máy chủ nội dung nghe nhìn

Tuỳ thuộc vào ứng dụng hệ thống (bao gồm cả phiên bản của ứng dụng) kết nối với dịch vụ trình duyệt nội dung đa phương tiện của mình, ứng dụng của bạn có thể nhận được các tính năng bổ sung sau:

Xử lý lỗi

Lỗi trong các ứng dụng đa phương tiện trên Android Automotive OS được thông báo qua PlaybackStateCompat của phiên đa phương tiện. Đối với tất cả các lỗi, hãy đặt mã lỗi và thông báo lỗi thích hợp vào PlaybackStateCompat. Điều này giúp Toast xuất hiện trong giao diện người dùng.

Khi ứng dụng xảy ra lỗi nhưng vẫn có thể tiếp tục phát, hãy đưa ra lỗi không nghiêm trọng. Ví dụ: người dùng có thể phát nhạc trong ứng dụng trước khi đăng nhập. Tuy nhiên, người dùng phải đăng nhập để có thể bỏ qua bài hát. Khi bạn dùng trạng thái lỗi không nghiêm trọng, hệ thống có thể đề xuất người dùng đăng nhập mà không làm gián đoạn mục nội dung nghe nhìn đang phát.

Khi bạn dùng trạng thái lỗi không nghiêm trọng, hãy giữ nguyên phần còn lại của PlaybackStateCompat, ngoài mã lỗi và thông báo lỗi. Phương pháp này cho phép tiếp tục phát mục nội dung nghe nhìn hiện tại trong lúc người dùng quyết định có đăng nhập hay không.

Trong trường hợp không thể phát, chẳng hạn như khi không có kết nối Internet và không có nội dung ngoại tuyến, hãy đặt trạng thái PlaybackStateCompat thành STATE_ERROR.

Trong các lần cập nhật PlaybackStateCompat tiếp theo, hãy xoá mọi mã lỗi và thông báo lỗi để tránh việc hiển thị nhiều cảnh báo cho cùng một lỗi.

Tại một thời điểm bất kỳ, nếu bạn không thể tải cây duyệt xem (ví dụ: nếu bạn yêu cầu xác thực và người dùng chưa đăng nhập), hãy gửi một cây duyệt xem trống. Để biểu thị điều này, hãy trả về một kết quả rỗng từ onLoadChildren() cho nút phương tiện gốc. Khi điều này xảy ra, hệ thống sẽ hiển thị lỗi toàn màn hình với thông báo lỗi được đặt trong PlaybackStateCompat.

Lỗi có thể xử lý

Nếu có một lỗi xử lý được, hãy thiết lập thêm hai tuỳ chọn bổ sung sau đây trong PlaybackStateCompat:

Các lỗi có thể xử lý xuất hiện dưới dạng Dialog mà người dùng chỉ có thể khắc phục khi dừng ô tô.

Kiểm thử các trường hợp lỗi

Xác minh rằng ứng dụng của bạn xử lý lỗi một cách linh hoạt trong mọi trường hợp, trong đó có:

  • Đa dạng cấp độ sản phẩm: chẳng hạn như phiên bản miễn phí so với phiên bản trả phí, khi đăng nhập so với khi đăng xuất.
  • Đa dạng trạng thái lái xe: chẳng hạn như khi đỗ xe so với khi lái xe.
  • Đa dạng trạng thái kết nối: chẳng hạn như trực tuyến so với ngoại tuyến.

Lưu ý khác

Hãy ghi nhớ những điều cần xem xét sau đây khi phát triển ứng dụng cho Android Automotive OS:

Nội dung ngoại tuyến

Nếu có thể, hãy tích hợp tính năng hỗ trợ phát ngoại tuyến. Ô tô chạy bằng Android Automotive OS sẽ có khả năng kết nối dữ liệu riêng, nghĩa là một gói dữ liệu sẽ được tính vào chi phí của xe hoặc do người dùng thanh toán. Tuy nhiên, ô tô cũng sẽ có nhiều cách thức kết nối hơn so với thiết bị di động.

Sau đây là một vài điều cần lưu ý khi bạn xem xét chiến lược hỗ trợ ngoại tuyến:

  • Thời điểm tốt nhất để tải nội dung xuống là trong lúc ứng dụng đang được sử dụng.
  • Đừng giả định rằng có sẵn Wi-Fi. Ô tô có thể không bao giờ đi vào phạm vi Wi-Fi, hoặc có thể OEM đã vô hiệu hoá tính năng bắt Wi-Fi để sử dụng mạng di động.
  • Kể cả khi bạn có thể tự động lưu trước vào bộ nhớ đệm những nội dung mà người dùng có khả năng sẽ sử dụng, bạn vẫn nên cho phép người dùng thay đổi hành vi này thông qua hoạt động cài đặt.
  • Dung lượng ổ đĩa trên ô tô có thể thay đổi, vì vậy, hãy cung cấp cho người dùng một cách để xoá nội dung ngoại tuyến, chẳng hạn như thông qua một tuỳ chọn trong hoạt động cài đặt.

Hỗ trợ WebView

WebView được hỗ trợ trong Android Automotive OS, nhưng chỉ được phép cho các hoạt động cài đặt và đăng nhập. Các hoạt động sử dụng WebView phải có thuộc tính tương tác với tính năng "đóng" hoặc "quay lại" bên ngoài WebView.

Sau đây là ví dụ về một số trường hợp sử dụng được chấp nhận đối với WebView:

  • Hiển thị chính sách quyền riêng tư, điều khoản dịch vụ hoặc các đường liên kết liên quan đến pháp lý khác trong hoạt động cài đặt.
  • Một luồng dựa trên nền tảng web trong hoạt động đăng nhập của bạn.

Khi sử dụng WebView, bạn có thể bật JavaScript.

Bảo mật WebView

Bạn nên thực hiện tất cả các biện pháp phòng ngừa giúp đảm bảo WebView không trở thành một điểm truy cập vào mạng lưới Internet rộng hơn. Hãy xem đoạn mã sau đây để tham khảo một ví dụ về cách khoá WebView với URL dùng trong lệnh gọi loadUrl() và ngăn lệnh chuyển hướng. Bạn nên triển khai các biện pháp bảo vệ như vậy ngay khi có thể, chẳng hạn như khi hiển thị các đường liên kết liên quan đến pháp lý.

Kotlin

override fun shouldOverrideUrlLoading(webView: WebView,
                             webResourceRequest: WebResourceRequest): Boolean {
  val originalUri: Uri = Uri.parse(webView.originalUrl)
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.url)) {
    return false
  }
  if (webResourceRequest.isRedirect) {
    logger.w("Redirect detected, not following")
    return true
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url)
  logger.w(
    String.format(
      "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri))
  return true
}

Java

@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
  Uri originalUri = Uri.parse(webView.getOriginalUrl());
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.getUrl())) {
    return false;
  }
  if (webResourceRequest.isRedirect()) {
    logger.w("Redirect detected, not following");
    return true;
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl());
  logger.w(
      String.format(
          "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri));
  return true;
}

Tên gói

Do bạn đã phân phối một Gói ứng dụng Android (APK) độc lập cho Android Automotive OS nên bạn có thể sử dụng lại tên gói của ứng dụng dành cho thiết bị di động hoặc đặt một tên gói mới. Nếu bạn sử dụng một tên gói khác, ứng dụng sẽ có hai trang thông tin riêng biệt trên Cửa hàng Play. Nếu bạn sử dụng lại tên gói hiện tại, ứng dụng của bạn sẽ có một trang thông tin duy nhất trên cả hai nền tảng.

Đây chủ yếu là một quyết định kinh doanh. Ví dụ: nếu bạn có một đội ngũ phát triển ứng dụng dành cho thiết bị di động và một đội ngũ khác phát triển ứng dụng trên Android Automotive OS thì bạn nên có các tên gói riêng biệt để mỗi đội ngũ quản lý trang thông tin của riêng họ trên Cửa hàng Play. Không có sự khác biệt lớn về mặt yêu cầu kỹ thuật để xem nên áp dụng phương pháp nào.

Bảng sau đây tóm tắt một số điểm khác biệt chính giữa việc giữ nguyên tên gói đang dùng và sử dụng một tên gói mới.

Tính năng Cùng một tên gói Tên gói mới
Trang thông tin trên Cửa hàng Play Một trang Nhiều trang
Chế độ cài đặt được phản chiếu Có hỗ trợ “Cài đặt lại ứng dụng nhanh” trong trình hướng dẫn thiết lập Không hỗ trợ
Quá trình xem xét trên Cửa hàng Play Chặn xem xét: nếu quá trình xem xét một tệp APK không thành công, các tệp APK khác được gửi trong cùng một bản phát hành cũng sẽ bị chặn Xem xét riêng lẻ
Số liệu thống kê, chỉ số và chỉ số quan trọng Kết hợp: bạn có thể lọc dữ liệu dành riêng cho ô tô. Riêng biệt
Lập chỉ mục và thứ hạng trong kết quả tìm kiếm Xây dựng thứ hạng hiện tại Không thể chuyển sang
Tích hợp với các ứng dụng khác Nhiều khả năng không cần thay đổi gì cả, hệ thống sẽ giả định rằng mã nội dung đa phương tiện được chia sẻ giữa hai tệp APK Có thể phải cập nhật ứng dụng tương ứng, ví dụ: đối với việc phát URI bằng Trợ lý Google

Câu hỏi thường gặp

Hãy xem các mục sau đây để biết câu trả lời cho một số câu hỏi thường gặp về Android Automotive OS.

Phần cứng

Ứng dụng của tôi có sử dụng được micrô không

Đối với ứng dụng nhắm đến hệ điều hành Android 10 (API cấp 29) trở lên, hãy tham khảo tài liệu về cách chia sẻ âm thanh đầu vào. Không thể thực hiện việc này đối với API cấp độ dưới 29.

Chúng tôi có thể truy cập vào API ô tô nào? Truy cập bằng cách nào?

Bạn chỉ có thể sử dụng các API mà OEM cho phép. Các quy trình đang được phát triển để chuẩn hoá cách bạn truy cập vào những API này.

Các ứng dụng có thể truy cập vào API của ô tô bằng cách sử dụng SetProperty()GetProperty() trong CarPropertyManager. Tham khảo mã nguồn hoặc tài liệu tham khảo để xem danh sách tất cả thuộc tính hiện có. Nếu thuộc tính được chú thích bằng @SystemApi, bạn chỉ có thể sử dụng thuộc tính này trong các ứng dụng hệ thống tải trước.

Những loại bộ mã hoá và giải mã âm thanh nào được hỗ trợ?

Tham khảo chi tiết về bộ mã hoá và giải mã âm thanh trong CDD (Tài liệu định nghĩa về khả năng tương thích) của Android.

DRM của Widevine có được hỗ trợ không?

Có. DRM của Widevine được hỗ trợ.

Phát triển và kiểm thử

Có hạn chế hoặc nội dung đề xuất nào đối với việc sử dụng SDK và thư viện của bên thứ ba không?

Chúng tôi không có nguyên tắc cụ thể nào về việc sử dụng SDK và thư viện của bên thứ ba. Nếu sử dụng SDK và thư viện của bên thứ ba thì bạn vẫn có trách nhiệm tuân thủ mọi yêu cầu về chất lượng đối với ứng dụng ô tô.

Tôi có thể sử dụng dịch vụ trên nền trước không?

Đối với dịch vụ trên nền trước, trường hợp sử dụng được cho phép duy nhất là tải nội dung sử dụng xuống trong chế độ ngoại tuyến. Nếu bạn có một trường hợp sử dụng khác cho dịch vụ trên nền trước mà bạn muốn được hỗ trợ, hãy liên hệ với chúng tôi qua nhóm thảo luận về Android Automotive OS.

Phát hành ứng dụng trên Android Automotive OS

Làm thế nào để phát hành ứng dụng trên Android Automotive OS bằng Google Play Console?

Quy trình phát hành ứng dụng trên Android Automotive OS cũng tương tự như quy trình phát hành ứng dụng dành cho điện thoại, nhưng bạn phải sử dụng một hệ số hình dạng khác. Để chọn sử dụng hệ số hình dạng dành cho Android Automotive OS, hãy làm theo các bước sau:

  1. Mở Play Console.
  2. Chọn ứng dụng của bạn.
  3. Trên trình đơn bên trái, hãy chọn Bản phát hành > Thiết lập > Cài đặt nâng cao > Hệ số hình dạng.
  4. Nhấp vào Thêm hệ số hình dạng > Android Automotive OS, sau đó làm theo hướng dẫn trong Play Console.

Tài nguyên khác

Để tìm hiểu thêm về Android Automotive OS, hãy xem các tài nguyên khác sau đây.

Mẫu

Hướng dẫn

Blog

Video

Báo cáo sự cố về nội dung đa phương tiện trên Android Automotive OS

Nếu gặp sự cố trong khi phát triển ứng dụng đa phương tiện cho Android Automotive OS, 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.

Báo lỗi mớ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.