Thêm tuỳ chọn hỗ trợ của 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 trình điều khiển tương thích với Android Automotive OS. Bạn có thể sử dụng lại hầu hết tất cả mã và tài nguyên trong ứng dụng Android Auto của mình, nhưng bạn phải tạo một bản dựng riêng đáp ứng các yêu cầu trên trang này.

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

Việc thêm tính năng hỗ trợ Android Automotive OS rất đơn giản, chỉ trong một vài bước:

  1. Bật các tính năng trên ô tô trong Android Studio
  2. Tạo mô-đun ô tô
  3. Cập nhật các phần phụ thuộc gradle
  4. Thêm các chế độ cài đặt hoặc hoạt động đăng nhập (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. Điều này có nghĩa là ứng dụng không vẽ giao diện người dùng và sẽ không khởi chạy các hoạt động khi người dùng kích hoạt tính năng 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 phương tiện. Bạn nên tham khảo Nguyên tắc thiết kế dành cho Android Automotive OS trong khi thiết kế những khu vực đó 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 để bật tính năng hỗ trợ cho Android Automotive OS.

Bật các tính năng trên ô 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ó các yêu cầu riêng về nền tảng. Vì vậy, bạn cần tạo một mô-đun có thể tách biệt mã cho các thành phần với mã khác trong dự án, chẳng hạn như mã được sử dụng cho ứng dụng đ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 chọn File > New > New Module (Tệp > Mới > Mô-đun mới).
  2. Chọn Automotive Module (Mô-đun Automotive), sau đó 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).

    Tất cả các loại ô tô hỗ trợ Android Automotive OS đều chạy trên Android 9 (API cấp 28) trở lên, vì vậy, cách chọn giá trị này nhắm đến 100% ô tô sử dụng Android Automotive OS.

  7. Chọn Add No Activity (Không thêm hoạt động nào) 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>

Bạn sẽ thấy một số thông tin tiêu chuẩn về ứng dụng trong phần tử application, nhưng cũng có một phần tử uses-feature khai báo có hỗ trợ Android Automotive OS. Ngoài ra, xin 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 được hệ thống kích hoạt bằng cách sử dụng ý định tường minh và là các hoạt động duy nhất cần được khai báo trong tệp kê khai cho ứng dụng trên Android Automotive OS.

Sau khi thêm hoạt động Cài đặt hoặc Đăng nhập, hãy hoàn tất tệp kê khai bằng cách cài đặt 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 đặt rõ ràng các tính năng này thành không bắt buộc sẽ đả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 trong thiết bị chạy Automotive OS.

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

Sử dụng mục nhập tệp kê khai sau đây để khai báo rằng ứng dụng hỗ trợ Android Automotive OS:

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

Mục nhập tệp kê khai này là một tệp XML khai báo những chức năng của ô tô mà ứng dụng hỗ trợ. Để cho biết 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. Tệp này phải bao gồm nội dung sau:

<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. Tệp kê khai không được chứa bất kỳ hoạt động nào có các bộ lọc ý định CATEGORY_LAUNCHER hoặc ACTION_MAIN.

Các hoạt động tương tự như những hoạt động trong ví dụ sau thường nhắm đến một điện thoại hoặc một số thiết bị di động khác. Bạn nên 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 trên 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 để dịch vụ trình duyệt nội dung đa phương tiện trong một mô-đun riêng được chia sẻ giữa ứng dụng điện thoại và mô-đun ô tô. Nếu đang sử 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 được chia sẻ, như hiển thị 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 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ó trong các API Android Media.

Bạn chỉ nên 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 chỉ định 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à Hoạt động đă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

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 mình. 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.

Phần còn lại của mục 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 tuỳ chọn như trongautomotive/src/main/res/xml/preferences.xml.
  3. Triển khai PreferenceFragmentCompat (xem SettingsFragment.kt trong UAMP) mà hoạt động cài đặt (xem SettingsActivity.kt) sẽ hiển thị. Xem 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 tham khảo các phương pháp hay nhất sau đây trong việc sử dụng một số thành phần trong Thư viện tuỳ chọn:

  • Ứng dụng không được có quá 2 cấp độ sâu (levels of depth) bên dưới chế độ xem chính trong hoạt động cài đặt.
  • Không sử dụng DropDownPreference. 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 đối tượng Preference lại với nhau.
      • Phải có title.
  • Tất cả các thành phần sau đây phải có keytitle, đồng thời có thể có summary và/hoặc icon:
    • Preference
      • Hãy tuỳ chỉnh logic trong lệnh gọi onPreferenceTreeClick()của quá trình triển khai PreferenceFragmentCompat.
    • CheckBoxPreference
      • Có thể có summaryOn hoặc summaryOff thay vì summary cho văn bản có điều kiện.
    • SwitchPreference
      • Có thể có summaryOn hoặc summaryOff thay vì summary cho văn bản có điều kiện.
      • Có thể có switchTextOn hoặc switchTextOff.
    • SeekBarPreference
      • Nên có min, maxdefaultValue.
    • EditTextPreference
      • Nên códialogTitle, positiveButtonTextnegativeButtonText.
      • Có thể có dialogMessage và/hoặc dialogLayoutResource.
    • com.example.android.uamp.automotive.lib.ListPreference
      • Chủ yếu bắt nguồn từ ListPreference
      • Dùng để hiển thị một 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 dụng yêu cầu người dùng đăng nhập trước khi có thể sử dụng ứng dụng, bạn có thể thêm hoạt động đăng nhậpđã tối ưu hoá cho xe mà chịu trách nhiệm đăng nhập và đăng xuất khỏi ứng dụng. Bạn cũng có thể thêm luồng công việc đăng nhập và đăng xuất vàohoạt động cài đặt, nhưng bạn nên sử dụng hoạt động đăng nhập chuyên dụng nếu người dùng không thể sử dụng ứng dụng cho đến khi đăng nhập. 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.

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 có thể 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 một kết quả rỗng bằng cách sử dụng phương thức sendResult().
  2. Đặt PlaybackState 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 PlaybackState 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 PlaybackState 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 hiển thị với 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ề PlaybackState của phiên đa phương tiện bằng phương thức setExtras(). Bao gồm hai khoá sau:

Đoạn mã sau đây cho biết cách ứng dụng có thể yêu cầu người dùng đăng nhập trước khi sử dụng ứng dụng:

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 người dùng đã xác thực thành công, ứng dụng phải đặt PlaybackState sang trạng thái khác so với STATE_ERROR, rồi chuyển hướng 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.

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 đăng nhập 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 liền mạch cho người dùng.

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

  • Đăng nhập bằng một lần chạm và đăng ký: Nếu đã áp dụng tính năng Một lần chạm (One Tap) cho các thiết bị khác (chẳng hạn như ứng dụng điện thoại), bạn cũng nên áp dụng tính năng này cho ứng dụng trên Android Automotive OS để hỗ trợ người dùng Một lần chạm hiện tại.
  • Đăng nhập bằng Google: Nếu bạn đã triển khai chức 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), bạn cũng nên triển khai Đăng nhập bằng Google cho ứng dụng trên Android Automotive OS để hỗ trợ những người dùng Đăng nhập bằng Google hiện có.
  • 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. Sau đó, khi 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 các thông tin đăng nhập đã lưu có liên quan. Việc sử dụng tính năng Tự động điền bằng Google không yêu cầu nhà phát triển ứng dụng phải bỏ công sức; tuy nhiên, nhà phát triển ứng dụng nên 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 Oreo 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ó trình xác thực thì 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 mình từ 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 "khách": Vì ô tô là thiết bị dùng chung, nên các OEM có thể cung cấp trải nghiệm "khách" trong xe khi không thể thêm tài khoản. Bạn có thể đặt giới hạn này bằng cách sử dụng DISALLOW_MODIFY_ACCOUNT 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.

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 PlaybackState của phiên đa phương tiện. Đối với tất cả các lỗi, bạn nên đặt mã lỗi và thông báo lỗi thích hợp trong PlaybackState. Điều này khiến 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, bạn nên gửi 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. Bằng cách sử dụng 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 việc phát nội dung của nội dung đa phương tiện hiện tại. Trong trường hợp này, bạn nên giữ nguyên phần còn lại của PlaybackState (ngoài mã lỗi và thông báo lỗi). Phương pháp này cho phép phát nội dung đa phương tiện hiện tại trong khi người dùng quyết định có đăng nhập hay không.

Khi 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, bạn nên đặt trạng thái PlaybackState thành STATE_ERROR.

Trong các lần cập nhật PlaybackState tiếp theo, bạn nên xoá 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 tìm kiếm (ví dụ: nếu bạn yêu cầu xác thực và người dùng chưa đăng nhập), bạn nên gửi một cây tìm kiếm trống. Để biểu thị điều này, onLoadChildren() cho nút phương tiện gốc sẽ trả về kết quả rỗng. 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 PlaybackState.

Lỗi có thể thao tác (actionable errors)

Nếu một lỗi có thể thao tác được, hãy đặt thêm hai tuỳ chọn bổ sung sau trong PlaybackState:

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

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

Bạn nên chắc chắn rằng ứng dụng của mình xử lý linh hoạt trong mọi trường hợp, bao gồm:

  • Các cấp độ sản phẩm khác nhau: Ví dụ: sản phẩm miễn phí so với sản phẩm trả phí, khi đăng nhập so với khi đăng xuất.
  • Các trạng thái lái xe khác nhau: Ví dụ: khi đậu xe so với khi lái xe.
  • Các trạng thái kết nối khác nhau: Ví dụ: trực tuyến so với ngoại tuyến.

Những điều cần xem xét 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 trên 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. Xe ô tô chạy Android Automotive OS có thể có khả năng kết nối dữ liệu riêng, nghĩa là một gói dữ liệu đượ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 có thể có nhiều khả năng kết nối hơn so với thiết bị di động. Do đó, bạn nên nghĩ đến chiến lược hỗ trợ ngoại tuyến tốt nhất cho nội dung của mình. Dung lượng ổ đĩa trên ô tô có thể thay đổi tuỳ xe, vì vậy, hãy đảm bảo rằng người dùng có thể xoá nội dung ngoại tuyến, ví dụ như thông qua tuỳ chọn trong hoạt động cài đặt.

Dưới đâ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 của mình:

  • Thời điểm tốt nhất để tải nội dung xuống là khi ứng dụng đang được sử dụng.
  • Khô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 OEM có thể đã vô hiệu hoá tính năng bắt Wi-Fi để sử dụng mạng di động.
  • Mặc dù bạn có thể lưu nội dung mà bạn nghĩ rằng người dùng có thể sẽ sử dụng một cách thông minh vào bộ nhớ đệm, nhưng bạ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.

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ó affordance với tính năng đóng và/hoặc quay lại ở ngoài WebView.

Dưới đây là một số ví dụ về các 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.
  • Quy trình đăng nhập dựa trên nền tảng web trong hoạt động đăng nhập.

Khi sử dụng WebView, bạn được phép 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 để đảm bảo WebView không hoạt động như một điểm truy cập vào mạng lưới Internet rộng hơn. Xem đoạn mã bên dưới để biế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 trong trường hợp sử dụng phù hợp (ví dụ: 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

Vì bạn phân phối một APK riêng cho Android Automotive OS, nên bạn có thể sử dụng lại tên gói của ứng dụng di động của mình hoặc đặt một tên gói mới. Điểm khác biệt chính là với một tên gói khác, ứng dụng có hai trang thông tin riêng biệt trên Cửa hàng Play. Còn nếu sử dụng lại tên gói hiện tại, 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 nhóm phát triển ứng dụng dành cho thiết bị di động và một nhóm hoàn toàn riêng biệt 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 và để mỗi nhóm quản lý trang thông tin của riêng mình trên Cửa hàng Play. Không có sự khác biệt lớn về mặt nỗ lực kỹ thuật cần thiết để sử dụng một trong hai phương pháp.

Bảng sau đây tóm tắt một số điểm khác biệt chính của mỗi phương pháp:

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
Mirrored install (cài đặt phản chiếu) Có. “Fast app reinstall" (Cài đặt lại ứng dụng nhanh) trong trình hướng dẫn thiết lập Không
Quá trình xem xét trên Cửa hàng Play Chặn quá trình xem xét. Hiện tại, 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ẻ
Thống kê, chỉ số và số liệu quan trọng Kết hợp Lưu ý: Bạn có thể lọc theo tên thiết bị để xem dữ liệu dành riêng cho ô tô (ví dụ: 2 ô tô vào năm 2020) Riêng biệt
Lập chỉ mục và xếp hạng tìm kiếm Xây dựng dựa trên trạng thái hiện tại Không chuyển sang
Tích hợp với các ứng dụng khác Giả sử mã đa phương tiện được chia sẻ giữa cả hai APK, rất có thể bạn không cần thay đổi gì cả. Có thể phải cập nhật ứng dụng tương ứng (ví dụ: 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ó thể sử dụng micrô không?

Đối với các ứng dụng nhắm mục tiêu 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 được OEM cho phép. Chúng tôi đang trong quá trình chuẩn hoá cách bạn truy cập 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ả các thuộc tính có sẵn. Nếu thuộc tính được chú thích với @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 đề 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, bạn vẫn có trách nhiệm tuân thủ tất cả 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à khi tải nội dung xuống để sử dụng 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 xem hỗ trợ, hãy liên hệ với chúng tôi bằng cách sử dụng 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 loại bản phát hành khác. Để chọn sử dụng loại bản phát hành 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.
  3. Trên trình đơn bên trái, hãy chọn Release > Setup > Advanced settings > Release types.
  4. Chọn Add release type > 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, vui lòng 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 phần Đăng ký theo dõi lỗi.