เพิ่มการรองรับ 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 ขององค์ประกอบ <application> เป็น "audio"

<application
  ...
  android:appCategory="audio" />

ประกาศข้อกำหนดของฟีเจอร์

แอปทั้งหมดที่สร้างขึ้นสำหรับ Android Automotive OS ต้องเป็นไปตามข้อกำหนดบางอย่างจึงจะเผยแพร่ได้โดยใช้ Google Play ดูข้อมูลเพิ่มเติมได้ที่ข้อกำหนดฟีเจอร์ Google Play ของ Meet

ประกาศการรองรับสื่อสำหรับ 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

สิทธิ์

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

เริ่มแอปโฮสต์สื่อ

คุณสามารถสร้าง Intent เพื่อเปิดแอปโฮสต์สื่อไปยังแอปหรือเนื้อหาภายในแอปได้ ตัวอย่างเช่น

  • แอปสามารถโพสต์การแจ้งเตือนที่มี Intent ที่รอดำเนินการซึ่งอนุญาตให้ผู้ใช้เปิดแอปเพื่อฟังเนื้อหาใหม่
  • แอปของคุณจัดการ Deep Link และเปิดแอปโฮสต์ไปยังมุมมองที่เหมาะสมที่สุดได้

ตรวจสอบความสามารถของโฮสต์สื่อ

แอปโฮสต์สื่อแต่ละเวอร์ชันรองรับความสามารถที่แตกต่างกัน โฮสต์จะระบุการรองรับความสามารถต่างๆ ด้วยการใส่ตัวกรอง Intent สําหรับการดำเนินการ Intent ต่อไปนี้

แอปโฮสต์สื่อทั้งหมดรองรับ Intent MEDIA_TEMPLATE หากต้องการตรวจสอบว่าโฮสต์สื่อรองรับ Intent MEDIA_TEMPLATE_V2 หรือไม่ ให้ใช้ queryIntentActivities() ดังนี้

val isMediaTemplateV2Supported = packageManager.queryIntentActivities(
  Intent(MediaIntentExtras.ACTION_MEDIA_TEMPLATE_V2),
  //  MATCH_DEFAULT_ONLY  since the host should be started with implicit intents
  //  MATCH_SYSTEM_ONLY  excludes any apps that aren't preinstalled
  PackageManager.MATCH_DEFAULT_ONLY or PackageManager.MATCH_SYSTEM_ONLY
).size > 0

สร้างและใช้ Intent

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

แป้นพิมพ์เสริม ประเภท คำอธิบาย การดำเนินการที่รองรับ
EXTRA_KEY_MEDIA_COMPONENT String ชื่อคอมโพเนนต์แบบแบนของ MediaBrowserService ที่แอปโฮสต์สื่อควรเชื่อมต่อ ซึ่งโดยทั่วไปคือแอปของคุณ หากไม่ได้ระบุข้อมูลเพิ่มเติมนี้ โฮสต์สื่อจะมีค่าเริ่มต้นเป็นแหล่งที่มาของสื่อที่ใช้งานอยู่ MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2
EXTRA_KEY_SEARCH_QUERY String คําค้นหาที่จะใช้เมื่อโทร MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2
EXTRA_KEY_MEDIA_ID String รหัสสื่อที่จะเปิดในมุมมองเรียกดู MEDIA_TEMPLATE_V2
EXTRA_KEY_SEARCH_ACTION Integer การดำเนินการหลังจากการค้นหา EXTRA_KEY_SEARCH_QUERY เสร็จสมบูรณ์ MEDIA_TEMPLATE_V2

ตัวอย่างเช่น เมื่อใช้โฮสต์ที่รองรับการดำเนินการ MEDIA_TEMPLATE_V2 โค้ดต่อไปนี้จะเปิดแอปโฮสต์สื่อ เชื่อมต่อกับ MyMediaBrowserService ค้นหา "แจ๊ซ" แล้วเล่นรายการแรกจากผลการค้นหา ในโฮสต์อื่นๆ ทั้งหมด ระบบจะเปิดแอปโฮสต์สื่อและค้นหา "แจ๊ซ" เท่านั้น โดยปล่อยให้ผู้ใช้เลือกรายการที่จะเล่นจากผลการค้นหา

val startMediaHostIntent = Intent(ACTION_MEDIA_TEMPLATE)
  .putExtra(MediaIntentExtras.EXTRA_KEY_MEDIA_COMPONENT, MyMediaBrowserService::class.java)
  .putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_QUERY, "Jazz")
  .putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_ACTION, MediaIntentExtras.EXTRA_VALUE_PLAY_FIRST_ITEM_FROM_SEARCH)

context.startActivity(startMediaHostIntent)

หากต้องการปรับปรุงประสบการณ์การใช้งานแอปสื่อในอุปกรณ์ที่ใช้ระบบปฏิบัติการ Android Automotive คุณสามารถเพิ่มการรองรับ Deep Link ลงในแอปได้ เช่น การดำเนินการนี้จะช่วยให้ผู้ใช้เปิดแอปจากเบราว์เซอร์ได้โดยตรง หรือเมื่อได้รับ URL ที่แชร์จากโทรศัพท์โดยใช้ Quick Share

เพิ่มตัวกรอง Intent ของ Deep Link

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

รองรับ Deep Link ทั้งหมดที่แอปบนอุปกรณ์เคลื่อนที่รองรับเพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีที่สุด หากแอปในรถรองรับ Deep Link ดังกล่าวอย่างสมเหตุสมผล หากแอปมีการตั้งค่าหรือกิจกรรมการลงชื่อเข้าใช้ คุณควรประกาศตัวกรอง Intent สำหรับจัดการการตั้งค่าและ Deep Link การลงชื่อเข้าใช้ภายในองค์ประกอบ <activity> Manifest ที่เกี่ยวข้อง สําหรับการเล่นสื่อและการเรียกดู Deep Link คุณสามารถใช้กิจกรรม Trampoline ตามที่อธิบายไว้ในส่วนนี้ในภายหลัง

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

เนื่องจากแอปโฮสต์จะวาด UI สำหรับการท่องเว็บและการเล่น กิจกรรมที่ใช้ในการจัดการ Deep Link สําหรับการเล่นและการท่องเว็บจึงไม่ควรมี UI เป็นของตัวเอง

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

fun DeepLinkTrampolineActivity : ComponentActivity() {

  override fun onCreate() {
    handleIntent(intent)
  }

  override fun onNewIntent(intent: Intent) {
    handleIntent(intent)
  }

  private fun handleIntent(intent: Intent) {
    // Handle any side effects, such as adding a song to the queue
    ...
    // Build the intent used to start the media host app
    val startMediaHostIntent = ...
    startActivity(intent)
    // Finish the activity immediately so it isn't shown on screen
    finish()
  }
}

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

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

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

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

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

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