เพิ่มการรองรับ Android Automotive OS ในแอปสื่อของคุณ

Android Automotive OS อนุญาตให้ผู้ใช้ติดตั้งแอปในรถยนต์ คุณต้องเผยแพร่แอปที่เพิ่มประสิทธิภาพให้ผู้ขับขี่ และเข้ากันได้กับ Android Automotive OS เพื่อเข้าถึงผู้ใช้ในแพลตฟอร์มนี้ คุณสามารถนําโค้ดและทรัพยากรเกือบทั้งหมดมาใช้ในแอป Android Auto ได้ แต่จะต้องสร้างบิลด์แยกต่างหากที่เป็นไปตามข้อกําหนดในหน้านี้

ภาพรวมการพัฒนา

การเพิ่มการรองรับ Android Automotive OS นั้นทำได้ง่ายเพียงไม่กี่ขั้นตอน ตามที่อธิบายไว้ในส่วนต่อไปนี้

  1. เปิดใช้ฟีเจอร์ยานยนต์ใน Android Studio
  2. สร้างโมดูลยานยนต์
  3. อัปเดต Dependency ของ Gradle
  4. ใช้การตั้งค่าและกิจกรรมการลงชื่อเข้าใช้ (ไม่บังคับ)
  5. อ่านคำแนะนำเกี่ยวกับโฮสต์สื่อ (ไม่บังคับ)

ข้อควรพิจารณาเกี่ยวกับการออกแบบ

Android Automotive OS จะจัดเลย์เอาต์เนื้อหาสื่อที่ได้รับจากบริการเรียกดูสื่อของแอป ซึ่งหมายความว่าแอปจะไม่วาด UI และไม่เริ่มกิจกรรมใดๆ เมื่อผู้ใช้เรียกให้เล่นสื่อ

หากคุณใช้การตั้งค่าหรือกิจกรรมการลงชื่อเข้าใช้ กิจกรรมเหล่านี้ต้องเพิ่มประสิทธิภาพสำหรับช่องทาง โปรดดูหลักเกณฑ์การออกแบบสำหรับ Android Automotive OS ขณะออกแบบส่วนต่างๆ ของแอป

สร้างโปรเจ็กต์

คุณต้องตั้งค่าหลายส่วนของโปรเจ็กต์แอปเพื่อเปิดใช้การรองรับ Android Automotive OS

เปิดใช้ฟีเจอร์ยานยนต์ใน Android Studio

ใช้ Android Studio 4.0 ขึ้นไปเพื่อให้แน่ใจว่าฟีเจอร์ทั้งหมดของ Automotive OS เปิดใช้งานอยู่

สร้างโมดูลยานยนต์

คอมโพเนนต์บางอย่างของ Android Automotive OS เช่น ไฟล์ Manifest มีข้อกำหนดเฉพาะแพลตฟอร์ม สร้างโมดูลที่สามารถแยกโค้ดของคอมโพเนนต์เหล่านี้ออกจากโค้ดอื่นๆ ในโปรเจ็กต์ เช่น โค้ดที่ใช้สำหรับแอปโทรศัพท์

ทําตามขั้นตอนต่อไปนี้เพื่อเพิ่มโมดูลยานยนต์ลงในโปรเจ็กต์

  1. ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โมดูลใหม่
  2. เลือกโมดูลยานยนต์ แล้วคลิกถัดไป
  3. ป้อนชื่อแอปพลิเคชัน/คลัง ชื่อนี้คือชื่อที่ผู้ใช้จะเห็นสำหรับแอปของคุณใน Android Automotive OS
  4. ป้อนชื่อข้อบังคับ
  5. ปรับชื่อแพ็กเกจให้ตรงกับแอป
  6. เลือก API 28: Android 9.0 (Pie) สำหรับ SDK ขั้นต่ำ แล้วคลิกถัดไป

    รถยนต์ทุกรุ่นที่รองรับ Android Automotive OS จะใช้ Android 9 (API ระดับ 28) ขึ้นไป ดังนั้นการเลือกค่านี้จะกำหนดเป้าหมายไปยังรถยนต์ที่เข้ากันได้ทั้งหมด

  7. เลือกไม่มีกิจกรรม แล้วคลิกเสร็จสิ้น

หลังจากสร้างโมดูลใน Android Studio แล้ว ให้เปิด AndroidManifest.xml ในไฟล์ .java ของโมดูลยานยนต์ใหม่

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

องค์ประกอบ application มีข้อมูลแอปมาตรฐานบางส่วน รวมถึงองค์ประกอบ uses-feature ที่ประกาศการรองรับ Android Automotive OS โปรดทราบว่าไม่มีกิจกรรมที่ประกาศในไฟล์ Manifest

หากคุณใช้การตั้งค่าหรือกิจกรรมการลงชื่อเข้าใช้ ให้เพิ่มรายการเหล่านั้นที่นี่ กิจกรรมเหล่านี้จะทริกเกอร์โดยระบบโดยใช้ Intent แบบชัดแจ้ง และเป็นกิจกรรมเดียวที่คุณประกาศภายในไฟล์ Manifest สําหรับแอป Android Automotive OS

หลังจากเพิ่มการตั้งค่าหรือกิจกรรมการลงชื่อเข้าใช้แล้ว ให้ทำตามขั้นตอนต่อไปนี้เพื่อทำให้ไฟล์ Manifest สมบูรณ์ โดยตั้งค่าแอตทริบิวต์ android:appCategory="audio" ในองค์ประกอบ application และเพิ่มองค์ประกอบ uses-feature ต่อไปนี้

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

การตั้งค่าฟีเจอร์เหล่านี้เป็น required="false" อย่างชัดแจ้งจะช่วยให้มั่นใจได้ว่าแอปของคุณจะไม่ขัดแย้งกับฟีเจอร์ฮาร์ดแวร์ที่มีอยู่ในอุปกรณ์ Automotive OS

ประกาศการรองรับสื่อสำหรับ Android Automotive OS

ใช้รายการไฟล์ Manifest ต่อไปนี้เพื่อประกาศว่าแอปของคุณรองรับ Android Automotive OS

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

รายการไฟล์ Manifest นี้หมายถึงไฟล์ XML ที่ประกาศความสามารถด้านยานยนต์ที่แอปของคุณรองรับ

หากต้องการระบุว่าคุณมีแอปสื่อ ให้เพิ่มไฟล์ XML ชื่อ automotive_app_desc.xml ลงในไดเรกทอรี res/xml/ ในโปรเจ็กต์ ใส่เนื้อหาต่อไปนี้ในไฟล์นี้

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

ตัวกรอง Intent

Android Automotive OS ใช้ Intent แบบชัดแจ้งเพื่อทริกเกอร์กิจกรรมในแอปสื่อของคุณ อย่าใส่กิจกรรมที่มีตัวกรอง Intent CATEGORY_LAUNCHER หรือ ACTION_MAIN ในไฟล์ Manifest

กิจกรรมอย่างเช่นในตัวอย่างต่อไปนี้มักจะกำหนดเป้าหมายเป็นโทรศัพท์หรืออุปกรณ์เคลื่อนที่อื่นๆ ประกาศกิจกรรมเหล่านี้ในโมดูลที่สร้างแอปโทรศัพท์ ไม่ใช่ในโมดูลที่สร้างแอป 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>

อัปเดต Dependency ของ Gradle

เราขอแนะนำให้คุณเก็บบริการเบราว์เซอร์สื่อไว้ในโมดูลแยกต่างหากที่คุณแชร์ระหว่างแอปโทรศัพท์กับโมดูลยานยนต์ หากใช้แนวทางนี้ คุณต้องอัปเดตโมดูลยานยนต์ให้รวมโมดูลที่แชร์ไว้ด้วย ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

my-auto-module/build.gradle

Groovy

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

Kotlin

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

ใช้การตั้งค่าและกิจกรรมการลงชื่อเข้าใช้

นอกจากบริการเบราว์เซอร์สื่อแล้ว คุณยังระบุการตั้งค่าที่เพิ่มประสิทธิภาพสำหรับยานพาหนะและกิจกรรมการลงชื่อเข้าใช้สำหรับแอป Android Automotive OS ได้ด้วย กิจกรรมเหล่านี้ช่วยให้คุณระบุฟังก์ชันการทำงานของแอปที่ไม่ได้รวมอยู่ใน Android Media API

ใช้กิจกรรมเหล่านี้เฉพาะในกรณีที่แอป Android Automotive OS จำเป็นต้องอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้หรือระบุการตั้งค่าแอป Android Auto จะไม่ใช้กิจกรรมเหล่านี้

เวิร์กโฟลว์กิจกรรม

แผนภาพต่อไปนี้แสดงวิธีที่ผู้ใช้โต้ตอบกับการตั้งค่าและกิจกรรมการลงชื่อเข้าใช้โดยใช้ Android Automotive OS

เวิร์กโฟลว์สําหรับการตั้งค่าและกิจกรรมการลงชื่อเข้าใช้

รูปที่ 1 เวิร์กโฟลว์การตั้งค่าและกิจกรรมการลงชื่อเข้าใช้

หลีกเลี่ยงสิ่งรบกวนในการตั้งค่าและกิจกรรมการลงชื่อเข้าใช้

โปรดตรวจสอบว่าองค์ประกอบ <activity> ไม่ได้รวมองค์ประกอบ <meta-data> ต่อไปนี้เพื่อให้แน่ใจว่าการตั้งค่าและ/หรือกิจกรรมการลงชื่อเข้าใช้จะใช้ได้เฉพาะขณะที่รถของผู้ใช้จอดอยู่ แอปของคุณจะถูกปฏิเสธระหว่างการตรวจสอบหากมีองค์ประกอบดังกล่าว

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

เพิ่มกิจกรรมการตั้งค่า

คุณสามารถเพิ่มกิจกรรมการตั้งค่าที่ปรับให้เหมาะกับยานพาหนะเพื่อให้ผู้ใช้กำหนดการตั้งค่าสำหรับแอปของคุณในรถได้ กิจกรรมการตั้งค่ายังอาจแสดงเวิร์กโฟลว์อื่นๆ ด้วย เช่น การลงชื่อเข้าใช้หรือออกจากระบบบัญชีของผู้ใช้ หรือการเปลี่ยนบัญชีผู้ใช้ โปรดทราบว่ากิจกรรมนี้จะทริกเกอร์โดยแอปที่ทำงานบน Android Automotive OS เท่านั้น แอปในโทรศัพท์ที่เชื่อมต่อกับ Android Auto จะไม่ใช้ฟีเจอร์นี้

ประกาศกิจกรรมการตั้งค่า

คุณต้องประกาศกิจกรรมการตั้งค่าในไฟล์ Manifest ของแอป ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

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

ใช้กิจกรรมการตั้งค่า

เมื่อผู้ใช้เปิดแอป Android Automotive OS จะตรวจหากิจกรรมการตั้งค่าที่คุณประกาศไว้และแสดงสิ่งต่างๆ ที่ผู้ใช้สามารถทำได้ เช่น ไอคอน ผู้ใช้สามารถแตะหรือเลือกสิ่งอำนวยความสะดวกนี้โดยใช้จอแสดงผลของรถยนต์เพื่อไปยังกิจกรรม Android Automotive OS จะส่ง Intent ACTION_APPLICATION_PREFERENCES ที่บอกให้แอปเริ่มกิจกรรมการตั้งค่า

ส่วนที่เหลือของส่วนนี้จะแสดงวิธีปรับโค้ดจากแอปตัวอย่าง Universal Android Music Player (UAMP) เพื่อใช้กิจกรรมการตั้งค่าสําหรับแอป

เริ่มต้นด้วยการดาวน์โหลดโค้ดตัวอย่าง โดยทำดังนี้

# 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

หากต้องการใช้กิจกรรม ให้ทําตามขั้นตอนต่อไปนี้

  1. คัดลอกโฟลเดอร์ automotive/automotive-lib ไปยังโมดูลยานยนต์
  2. กำหนดลําดับชั้นค่ากําหนดดังใน automotive/src/main/res/xml/preferences.xml
  3. ใช้ PreferenceFragmentCompat ที่แสดงกิจกรรมการตั้งค่า ดูข้อมูลเพิ่มเติมได้ที่ไฟล์ SettingsFragment.kt และ SettingsActivity.kt ใน UAMP และคู่มือการตั้งค่า Android

เมื่อใช้กิจกรรมการตั้งค่า ให้พิจารณาแนวทางปฏิบัติแนะนำต่อไปนี้ในการใช้คอมโพเนนต์บางอย่างในไลบรารีค่ากําหนด

  • มีระดับความลึกไม่เกิน 2 ชั้นใต้มุมมองหลักในกิจกรรมการตั้งค่า
  • อย่าใช้ DropDownPreference ให้ใช้ ListPreference แทน
  • องค์ประกอบขององค์กร
    • PreferenceScreen
      • ต้องเป็นระดับบนสุดของลําดับชั้นค่ากําหนด
    • PreferenceCategory
      • ใช้เพื่อจัดกลุ่มออบเจ็กต์ Preference เข้าด้วยกัน
      • ใส่ title
  • ใส่ key และ title ในทุกคอมโพเนนต์ต่อไปนี้ นอกจากนี้ คุณยังใส่ summary, icon หรือทั้ง 2 อย่างได้ ดังนี้
    • Preference
      • ปรับแต่งตรรกะใน onPreferenceTreeClick() callback ของการติดตั้งใช้งาน PreferenceFragmentCompat
    • CheckBoxPreference
      • มี summaryOn หรือ summaryOff แทน summary สำหรับข้อความแบบมีเงื่อนไขได้
    • SwitchPreference
      • มี summaryOn หรือ summaryOff แทน summary สำหรับข้อความแบบมีเงื่อนไขได้
      • มี switchTextOn หรือ switchTextOff
    • SeekBarPreference
      • ใส่ min, max และ defaultValue
    • EditTextPreference
      • รวม dialogTitle, positiveButtonText และ negativeButtonText
      • มี dialogMessage และ/หรือ dialogLayoutResource
    • com.example.android.uamp.automotive.lib.ListPreference
      • มาจาก ListPreference ส่วนใหญ่
      • ใช้เพื่อแสดงรายการแบบตัวเลือกเดียวของออบเจ็กต์ Preference
      • ต้องมีอาร์เรย์ของ entries และ entryValues ที่เกี่ยวข้อง
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • มาจาก MultiSelectListPreference เป็นส่วนใหญ่
      • ใช้เพื่อแสดงรายการแบบเลือกหลายรายการของออบเจ็กต์ Preference
      • ต้องมีอาร์เรย์ของ entries และ entryValues ที่เกี่ยวข้อง

เพิ่มกิจกรรมการลงชื่อเข้าใช้

หากแอปกำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้ก่อนจึงจะใช้แอปได้ คุณสามารถเพิ่มกิจกรรมการลงชื่อเข้าใช้ที่เพิ่มประสิทธิภาพสำหรับยานพาหนะซึ่งจัดการการลงชื่อเข้าใช้และออกจากระบบแอปได้ นอกจากนี้ คุณยังเพิ่มเวิร์กโฟลว์การลงชื่อเข้าใช้และออกจากระบบลงในกิจกรรมการตั้งค่าได้ด้วย แต่ให้ใช้กิจกรรมการลงชื่อเข้าใช้เฉพาะในกรณีที่แอปใช้งานไม่ได้จนกว่าผู้ใช้จะลงชื่อเข้าใช้ โปรดทราบว่ากิจกรรมนี้จะทริกเกอร์โดยแอปที่ทำงานบน Android Automotive OS เท่านั้น แต่แอปในโทรศัพท์ที่เชื่อมต่อกับ Android Auto จะไม่ใช้

ต้องลงชื่อเข้าใช้เมื่อเริ่มแอป

หากต้องการกำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้ก่อนจึงจะใช้แอปได้ บริการเบราว์เซอร์สื่อของคุณต้องทำสิ่งต่อไปนี้

  1. ในเมธอด onLoadChildren() ของบริการ ให้ส่งผลลัพธ์ null โดยใช้เมธอด sendResult()
  2. ตั้งค่า PlaybackStateCompat ของเซสชันสื่อเป็น STATE_ERROR ใช้เมธอด setState() ซึ่งจะบอกให้ Android Automotive OS ทราบว่าจะดำเนินการอื่นๆ ไม่ได้จนกว่าจะแก้ไขข้อผิดพลาด
  3. ตั้งค่าPlaybackStateCompat รหัสข้อผิดพลาดของเซสชันสื่อเป็น ERROR_CODE_AUTHENTICATION_EXPIRED ซึ่งจะบอก Android Automotive OS ว่าผู้ใช้ต้องตรวจสอบสิทธิ์
  4. ตั้งค่าPlaybackStateCompat ข้อความแสดงข้อผิดพลาดของเซสชันสื่อโดยใช้เมธอด setErrorMessage() เนื่องจากข้อความแสดงข้อผิดพลาดนี้แสดงต่อผู้ใช้ ให้แปลข้อความสำหรับภาษาปัจจุบันของผู้ใช้
  5. ตั้งค่าPlaybackStateCompat ข้อมูลเพิ่มเติมของเซสชันสื่อโดยใช้เมธอด setExtras() ใส่คีย์ 2 รายการต่อไปนี้

    • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL: สตริงที่แสดงบนปุ่มที่เริ่มเวิร์กโฟลว์การลงชื่อเข้าใช้ เนื่องจากสตริงนี้แสดงต่อผู้ใช้ ให้แปลเป็นภาษาท้องถิ่นปัจจุบันของผู้ใช้
    • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT: PendingIntent ที่นําผู้ใช้ไปยังกิจกรรมการลงชื่อเข้าใช้เมื่อผู้ใช้แตะปุ่มที่กล่าวถึงใน PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL

ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่แอปกำหนดให้ผู้ใช้ลงชื่อเข้าใช้ก่อนใช้แอป

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);

หลังจากตรวจสอบสิทธิ์ผู้ใช้เรียบร้อยแล้ว ให้ตั้งค่า PlaybackStateCompat ให้กลับเป็นสถานะอื่นที่ไม่ใช่ STATE_ERROR จากนั้นนําผู้ใช้กลับไปยัง Android Automotive OS โดยการเรียกใช้เมธอด finish() ของกิจกรรม

ของกิจกรรม

ใช้กิจกรรมการลงชื่อเข้าใช้

Google มีเครื่องมือระบุตัวตนมากมายที่คุณสามารถใช้เพื่อช่วยผู้ใช้ลงชื่อเข้าใช้แอปในรถ เครื่องมือบางอย่าง เช่น Firebase Authentication มีชุดเครื่องมือแบบ Full Stack ที่ช่วยให้คุณสร้างประสบการณ์การตรวจสอบสิทธิ์ที่ปรับแต่งได้ เครื่องมืออื่นๆ ใช้ประโยชน์จากข้อมูลเข้าสู่ระบบที่มีอยู่ของผู้ใช้หรือเทคโนโลยีอื่นๆ เพื่อช่วยให้คุณสร้างประสบการณ์การลงชื่อเข้าใช้ที่ราบรื่นสำหรับผู้ใช้

เครื่องมือต่อไปนี้จะช่วยให้ผู้ใช้ที่เคยลงชื่อเข้าใช้ในอุปกรณ์เครื่องอื่นก่อนหน้านี้เข้าสู่ระบบได้ง่ายขึ้น

  • การลงชื่อเข้าใช้และลงชื่อสมัครใช้ด้วย One Tap: หากคุณใช้ One Tap กับอุปกรณ์อื่นๆ อยู่แล้ว เช่น แอปโทรศัพท์ ให้ใช้กับแอประบบปฏิบัติการ Android Automotive เพื่อรองรับผู้ใช้ One Tap ที่มีอยู่
  • Google Sign-in: หากคุณใช้ Google Sign-in กับอุปกรณ์อื่นๆ อยู่แล้ว เช่น แอปโทรศัพท์ ให้ใช้ Google Sign-in กับแอป Android Automotive OS เพื่อรองรับผู้ใช้ Google Sign-in ที่มีอยู่
  • ป้อนข้อความอัตโนมัติด้วย Google: หากผู้ใช้เลือกใช้ฟีเจอร์ป้อนข้อความอัตโนมัติด้วย Google ในอุปกรณ์ Android เครื่องอื่นๆ ระบบจะบันทึกข้อมูลเข้าสู่ระบบไว้ในเครื่องมือจัดการรหัสผ่านบน Google เมื่อผู้ใช้ลงชื่อเข้าใช้แอป Android Automotive OS การป้อนข้อความอัตโนมัติด้วย Google จะแนะนำข้อมูลเข้าสู่ระบบที่บันทึกไว้ที่เกี่ยวข้อง การใช้ฟีเจอร์ป้อนข้อความอัตโนมัติด้วย Google นั้นไม่จําเป็นต้องทําการพัฒนาแอปพลิเคชัน อย่างไรก็ตาม นักพัฒนาแอปพลิเคชันสามารถเพิ่มประสิทธิภาพแอปเพื่อให้ได้ผลลัพธ์ที่มีคุณภาพดีขึ้น อุปกรณ์ทั้งหมดที่ใช้ Android 8.0 (API ระดับ 26) ขึ้นไป รวมถึง Android Automotive OS รองรับการป้อนข้อความอัตโนมัติด้วย Google

ใช้ AccountManager

แอป Android Automotive OS ที่มีการรับรองต้องใช้ AccountManager ด้วยเหตุผลต่อไปนี้

  • UX ที่ดีขึ้นและการจัดการบัญชีที่ง่ายขึ้น: ผู้ใช้สามารถจัดการบัญชีทั้งหมดได้อย่างง่ายดายจากเมนูบัญชีในการตั้งค่าระบบ ซึ่งรวมถึงการลงชื่อเข้าใช้และออกจากระบบ
  • ประสบการณ์การใช้งานแบบ"ผู้มาเยือน": รถยนต์เป็นอุปกรณ์ที่ใช้ร่วมกัน ซึ่งหมายความว่า OEM สามารถเปิดใช้ประสบการณ์การใช้งานแบบ "ผู้มาเยือน" ในยานพาหนะ ซึ่งจะเพิ่มบัญชีไม่ได้ ข้อจำกัดนี้ทำได้โดยใช้ DISALLOW_MODIFY_ACCOUNTS สำหรับ AccountManager

สิทธิ์

หากต้องการขอสิทธิ์จากผู้ใช้ ให้ใช้ขั้นตอนเดียวกับกิจกรรมการตรวจสอบสิทธิ์หรือกิจกรรมการตั้งค่าในแผนภาพเวิร์กโฟลว์กิจกรรมที่แสดงในส่วนก่อนหน้า

อ่านคำแนะนำสำหรับโฮสต์สื่อ

แอปพลิเคชันของคุณอาจได้รับข้อมูลเพิ่มเติมต่อไปนี้ ทั้งนี้ขึ้นอยู่กับแอปพลิเคชันของระบบ (รวมถึงเวอร์ชัน) ที่เชื่อมต่อกับบริการเบราว์เซอร์สื่อ

การจัดการข้อผิดพลาด

ระบบจะสื่อสารข้อผิดพลาดในแอปสื่อใน Android Automotive OS ผ่าน PlaybackStateCompat ของเซสชันสื่อ สำหรับข้อผิดพลาดทั้งหมด ให้ตั้งค่ารหัสข้อผิดพลาดและข้อความแสดงข้อผิดพลาดที่เหมาะสมใน PlaybackStateCompat ซึ่งจะทำให้ Toast ปรากฏขึ้นใน UI

เมื่อเกิดข้อผิดพลาดแต่การเล่นยังดำเนินต่อไปได้ ให้ออกข้อผิดพลาดที่ไม่ร้ายแรง ตัวอย่างเช่น ผู้ใช้อาจเล่นเพลงในแอปได้ก่อนที่จะลงชื่อเข้าใช้ แต่จะต้องลงชื่อเข้าใช้ก่อนจึงจะข้ามเพลงได้ เมื่อคุณใช้ข้อผิดพลาดที่ไม่ร้ายแรง ระบบอาจแนะนำให้ผู้ใช้เข้าสู่ระบบโดยไม่หยุดเล่นรายการสื่อปัจจุบัน

เมื่อคุณพบข้อผิดพลาดที่ไม่ร้ายแรง ให้เก็บPlaybackStateCompatที่เหลือไว้ตามเดิม ยกเว้นรหัสข้อผิดพลาดและข้อความแสดงข้อผิดพลาด การใช้แนวทางนี้จะช่วยให้การเล่นรายการสื่อปัจจุบันเล่นต่อไปได้ขณะที่ผู้ใช้ตัดสินใจว่าจะลงชื่อเข้าใช้หรือไม่

เมื่อเล่นไม่ได้ เช่น เมื่อไม่ได้เชื่อมต่ออินเทอร์เน็ตและไม่มีเนื้อหาแบบออฟไลน์ ให้ตั้งค่าสถานะ PlaybackStateCompat เป็น STATE_ERROR

ในการอัปเดต PlaybackStateCompat ครั้งต่อๆ ไป ให้ล้างรหัสข้อผิดพลาดและข้อความแสดงข้อผิดพลาดเพื่อหลีกเลี่ยงการแสดงคำเตือนหลายรายการสำหรับข้อผิดพลาดเดียวกัน

หากโหลดทรีการเรียกดูไม่ได้ ณ เวลาใดก็ตาม เช่น หากกำหนดให้ต้องตรวจสอบสิทธิ์และผู้ใช้ไม่ได้ลงชื่อเข้าใช้ ให้ส่งทรีการเรียกดูที่ว่างเปล่า หากต้องการระบุสถานะนี้ ให้แสดงผลลัพธ์ Null จาก onLoadChildren() สำหรับโหนดสื่อรูท เมื่อเกิดเหตุการณ์เช่นนี้ ระบบจะแสดงข้อผิดพลาดแบบเต็มหน้าจอพร้อมข้อความแสดงข้อผิดพลาดที่ตั้งค่าไว้ใน PlaybackStateCompat

ข้อผิดพลาดที่ดำเนินการได้

หากข้อผิดพลาดสามารถดำเนินการได้ ให้ตั้งค่าเพิ่มเติม 2 รายการต่อไปนี้ใน PlaybackStateCompat

  • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL: ป้ายกำกับของปุ่มที่จะคลิกเพื่อแก้ไขข้อผิดพลาด เนื่องจากสตริงนี้แสดงต่อผู้ใช้ ให้แปลเป็นภาษาท้องถิ่นปัจจุบันของผู้ใช้
  • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT: PendingIntent ที่ปุ่มเรียกใช้เพื่อแก้ไขข้อผิดพลาด เช่น การเปิดใช้งานกิจกรรมการลงชื่อเข้าใช้

ข้อผิดพลาดที่แก้ไขได้จะปรากฏเป็น Dialog และผู้ใช้จะแก้ไขได้ก็ต่อเมื่อรถหยุดอยู่เท่านั้น

การทดสอบกรณีข้อผิดพลาด

ยืนยันว่าแอปจัดการข้อผิดพลาดอย่างราบรื่นในทุกสถานการณ์ ซึ่งรวมถึงกรณีต่อไปนี้

  • ระดับต่างๆ ของผลิตภัณฑ์: เช่น ฟรีเทียบกับพรีเมียม หรือลงชื่อเข้าใช้เทียบกับไม่ได้ลงชื่อเข้าใช้
  • สถานะการขับขี่ที่แตกต่างกัน: เช่น จอดรถอยู่หรือขับรถ
  • สถานะการเชื่อมต่อที่แตกต่างกัน: เช่น ออนไลน์เทียบกับออฟไลน์

ปัจจัยพิจารณาอื่นๆ

โปรดคำนึงถึงข้อควรพิจารณาอื่นๆ ต่อไปนี้เมื่อพัฒนาแอป Android AutomotiveOS

เนื้อหาแบบออฟไลน์

ใช้การรองรับการเล่นแบบออฟไลน์ (หากมี) รถยนต์ที่ใช้ Android Automotive OS คาดว่าจะมีการเชื่อมต่ออินเทอร์เน็ตของตัวเอง ซึ่งหมายความว่าแพ็กเกจอินเทอร์เน็ตจะรวมอยู่ในค่าใช้จ่ายของยานพาหนะหรือผู้ใช้เป็นผู้จ่าย อย่างไรก็ตาม รถยนต์ก็ควรมีการเชื่อมต่อที่หลากหลายกว่าอุปกรณ์เคลื่อนที่ด้วย

สิ่งที่ควรคำนึงถึงเมื่อพิจารณากลยุทธ์การสนับสนุนแบบออฟไลน์มีดังนี้

  • เวลาที่ดีที่สุดในการดาวน์โหลดเนื้อหาคือขณะที่มีการใช้แอป
  • อย่าคิดว่ามี Wi-Fi ให้บริการ รถอาจไม่เคยอยู่ในระยะสัญญาณ Wi-Fi หรือ OEM อาจปิดใช้ Wi-Fi เพื่อใช้เครือข่ายมือถือแทน
  • แม้ว่าการแคชเนื้อหาที่คาดว่าผู้ใช้จะใช้อย่างชาญฉลาดจะเป็นสิ่งที่ทำได้ แต่เราขอแนะนำให้คุณอนุญาตให้ผู้ใช้เปลี่ยนลักษณะการทำงานนี้ผ่านกิจกรรมการตั้งค่า
  • พื้นที่ว่างในดิสก์ของรถยนต์จะแตกต่างกันไป ดังนั้นโปรดแจ้งให้ผู้ใช้ทราบถึงวิธีลบเนื้อหาแบบออฟไลน์ เช่น ผ่านตัวเลือกในกิจกรรมการตั้งค่า

การรองรับ WebView

ระบบรองรับ WebView ใน Android Automotive OS แต่อนุญาตให้ใช้กับการตั้งค่าและกิจกรรมการลงชื่อเข้าใช้เท่านั้น กิจกรรมที่ใช้ WebView ต้องมีตัวเลือก "ปิด" หรือ "กลับ" นอก WebView

ตัวอย่าง Use Case ที่ยอมรับได้สำหรับ WebView มีดังนี้

  • การแสดงนโยบายความเป็นส่วนตัว ข้อกำหนดในการให้บริการ หรือลิงก์อื่นๆ ที่เกี่ยวข้องกับกฎหมายในกิจกรรมการตั้งค่า
  • ขั้นตอนการลงชื่อเข้าใช้บนเว็บ

เมื่อใช้ WebView คุณจะเปิดใช้ JavaScript ได้

รักษาความปลอดภัยให้ WebView

ใช้มาตรการป้องกันทั้งหมดที่ทำได้เพื่อช่วยให้มั่นใจว่า WebView ไม่ใช่จุดแรกเข้าสู่อินเทอร์เน็ต ดูตัวอย่างวิธีล็อก WebView กับ URL ที่ใช้ในการเรียก loadUrl() และป้องกันการเปลี่ยนเส้นทางได้จากข้อมูลโค้ดต่อไปนี้ เราขอแนะนําอย่างยิ่งให้คุณใช้มาตรการป้องกันเช่นนี้เมื่อทําได้ เช่น เมื่อแสดงลิงก์ที่เกี่ยวข้องกับกฎหมาย

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;
}

ชื่อแพ็กเกจ

เนื่องจากคุณจัดจำหน่ายชุดแพ็กเกจ Android (APK) แยกต่างหากสำหรับ Android Automotive OS คุณจึงใช้ชื่อแพ็กเกจจากแอปบนอุปกรณ์เคลื่อนที่ซ้ำหรือสร้างชื่อแพ็กเกจใหม่ได้ หากใช้ชื่อแพ็กเกจอื่น แอปของคุณจะมีข้อมูลผลิตภัณฑ์ 2 รายการแยกกันใน Play Store หากใช้ชื่อแพ็กเกจปัจจุบันซ้ำ แอปของคุณจะมีข้อมูลเพียงรายการเดียวในทั้ง 2 แพลตฟอร์ม

นี่เป็นการตัดสินใจทางธุรกิจเป็นหลัก ตัวอย่างเช่น หากคุณมีทีมหนึ่งพัฒนาแอปบนอุปกรณ์เคลื่อนที่ และอีกทีมหนึ่งพัฒนาแอป Android AutomotiveOS ก็อาจใช้ชื่อแพ็กเกจแยกกันและให้แต่ละทีมจัดการข้อมูลผลิตภัณฑ์ใน Play Store ของตนเอง ความพยายามทางเทคนิคในการใช้แนวทางใดแนวทางหนึ่งนั้นไม่แตกต่างกันมากนัก

ตารางต่อไปนี้จะสรุปความแตกต่างสำคัญอื่นๆ ระหว่างการคงชื่อแพ็กเกจปัจจุบันไว้กับการใช้ชื่อแพ็กเกจใหม่

ฟีเจอร์ ชื่อแพ็กเกจเดียวกัน ชื่อแพ็กเกจใหม่
ข้อมูลผลิตภัณฑ์ใน Store ซิงเกิล หลายรายการ
การติดตั้งแบบมิเรอร์ มี: "ติดตั้งแอปอีกครั้งอย่างรวดเร็ว" ในระหว่างวิซาร์ดการตั้งค่า ไม่
กระบวนการตรวจสอบของ Play Store การบล็อกการตรวจสอบ: หาก APK รายการหนึ่งไม่ผ่านการตรวจสอบ ระบบจะบล็อก APK อื่นๆ ที่ส่งในรุ่นเดียวกัน รีวิวแต่ละรายการ
สถิติ เมตริก และข้อมูลประสิทธิภาพที่สำคัญ รวม: คุณสามารถกรองหาข้อมูลเฉพาะยานยนต์ได้ แยก
การจัดทำดัชนีและการจัดอันดับการค้นหา สร้างจากอันดับปัจจุบัน ไม่มีการนำยอดคงเหลือไปรวม
การผสานรวมกับแอปอื่นๆ ส่วนใหญ่แล้วไม่จําเป็นต้องเปลี่ยนแปลงใดๆ โดยสมมติว่าทั้ง 2 APK ใช้รหัสสื่อร่วมกัน อาจต้องอัปเดตแอปที่เกี่ยวข้อง เช่น สำหรับการเล่น URI ด้วย Google Assistant

คำถามที่พบบ่อย

ดูคำตอบสำหรับคำถามที่พบบ่อยเกี่ยวกับระบบปฏิบัติการ Android Automotive ได้ที่ส่วนต่อไปนี้

ฮาร์ดแวร์

แอปของฉันจะเข้าถึงไมโครโฟนได้ไหม

สำหรับแอปที่กำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ขึ้นไป โปรดดูเอกสารการแชร์อินพุตเสียง ซึ่งไม่สามารถทำได้ก่อน API ระดับ 29

เราเข้าถึง API รถยนต์รายการใดได้บ้างและอย่างไร

คุณจะใช้ได้เฉพาะ API ที่ OEM เปิดเผย เรากําลังพัฒนากระบวนการเพื่อกำหนดมาตรฐานการเข้าถึง API เหล่านี้

แอปเข้าถึง API ของรถยนต์ได้โดยใช้ SetProperty() และ GetProperty() ใน CarPropertyManager ดูรายการพร็อพเพอร์ตี้ทั้งหมดที่ใช้ได้ได้จากซอร์สโค้ดหรือเอกสารอ้างอิง หากพร็อพเพอร์ตี้มีคำอธิบายประกอบด้วย @SystemApi แสดงว่าพร็อพเพอร์ตี้ดังกล่าวจำกัดไว้สำหรับแอประบบที่โหลดไว้ล่วงหน้าเท่านั้น

รองรับตัวแปลงรหัสเสียงประเภทใดบ้าง

โปรดดูรายละเอียดตัวแปลงรหัสเสียงใน CDD ของ Android

รองรับ Widevine DRM ไหม

ได้ รองรับ Widevine DRM

การพัฒนาและการทดสอบ

มีข้อจำกัดหรือคําแนะนําในการใช้ SDK และไลบรารีของบุคคลที่สามไหม

เราไม่มีหลักเกณฑ์เฉพาะในการใช้ SDK และไลบรารีของบุคคลที่สาม หากเลือกใช้ SDK และไลบรารีของบุคคลที่สาม คุณยังคงมีหน้าที่รับผิดชอบในการปฏิบัติตามข้อกำหนดด้านคุณภาพของแอปรถยนต์ทั้งหมด

ฉันจะใช้บริการที่ทำงานอยู่เบื้องหน้าได้ไหม

Use Case เดียวที่อนุญาตสำหรับบริการที่ทำงานอยู่เบื้องหน้าคือการดาวน์โหลดเนื้อหาเพื่อใช้งานแบบออฟไลน์ หากคุณมีกรณีการใช้งานอื่นสำหรับบริการที่ทำงานอยู่เบื้องหน้าที่ต้องการให้เรารองรับ โปรดติดต่อเราโดยใช้กลุ่มสนทนาของ Android Automotive OS

การเผยแพร่แอป Android Automotive OS

ฉันจะเผยแพร่แอป Android Automotive OS โดยใช้ Google Play Console ได้อย่างไร

ดูรายละเอียดเกี่ยวกับวิธีเผยแพร่แอป Android Automotive OS โดยใช้ Google Play Console ได้ที่เผยแพร่ไปยังรถยนต์

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Android Automotive OS ได้ที่แหล่งข้อมูลเพิ่มเติมต่อไปนี้

ตัวอย่าง

เส้นนำ

บล็อก

วิดีโอ

รายงานปัญหาเกี่ยวกับสื่อใน Android Automotive OS

หากพบปัญหาขณะพัฒนาแอปสื่อสำหรับ Android Automotive OS คุณสามารถรายงานปัญหาได้โดยใช้เครื่องมือติดตามปัญหาของ Google โปรดกรอกข้อมูลที่ขอทั้งหมดในเทมเพลตปัญหา

สร้างปัญหาใหม่

ก่อนรายงานปัญหาใหม่ โปรดตรวจสอบว่าปัญหาดังกล่าวได้รับการรายงานแล้วในรายการปัญหาหรือไม่ คุณสามารถติดตามและโหวตปัญหาได้โดยคลิกดาวสำหรับปัญหาในเครื่องมือติดตาม ดูข้อมูลเพิ่มเติมได้ที่การติดตามปัญหา