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

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

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

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

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

ข้อควรพิจารณาในการออกแบบ

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

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

ตั้งค่าโปรเจ็กต์

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

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

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

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

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

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

  1. ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โมดูลใหม่
  2. เลือก Automotive Module แล้วคลิก Next
  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 ใน โมดูลยานยนต์ใหม่

<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 ที่ประกาศ Automotive ที่แอปของคุณรองรับ

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

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

ตัวกรอง Intent

Android Automotive OS ใช้ Intent แบบเจาะจงเพื่อทริกเกอร์กิจกรรมในสื่อ แอป อย่ารวมกิจกรรมใดๆ ที่มี CATEGORY_LAUNCHER หรือ ACTION_MAIN Intent ตัวกรองในไฟล์ 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

ดึงดูด

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 ส่ง ACTION_APPLICATION_PREFERENCES Intent ที่บอกให้แอปเริ่มกิจกรรมการตั้งค่า

เนื้อหาที่เหลือของส่วนนี้จะแสดงวิธีปรับเปลี่ยนโค้ดจากแท็ก 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() ของ การใช้งาน 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 จะไม่ใช้

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

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

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

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

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

ใช้ Account Manager

แอป Android Automotive OS ที่มีการตรวจสอบสิทธิ์ต้องใช้ AccountManager เนื่องจากเหตุผลต่อไปนี้

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

สิทธิ์

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

อ่านคําแนะนําของโฮสต์สื่อ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

โปรดคำนึงถึงข้อควรพิจารณาอื่นๆ เหล่านี้เมื่อพัฒนา Android Automotive แอประบบปฏิบัติการ:

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

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

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

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

การรองรับ WebView

WebView ใช้ได้ใน Android Automotive OS แต่อนุญาตสำหรับ การตั้งค่าและกิจกรรมการลงชื่อเข้าใช้ของคุณ กิจกรรมที่ใช้ WebView ต้องมีองค์ประกอบ "ปิด" หรือ "back" ในราคาที่คุ้มค่านอก 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 Package Kit (APK) แยกต่างหากสำหรับ Android Automotive OS คุณจึงทำสิ่งต่อไปนี้ได้ ใช้ชื่อแพ็กเกจจากแอปบนอุปกรณ์เคลื่อนที่ของคุณซ้ำหรือสร้างแพ็กเกจใหม่ ชื่อ หากคุณใช้ชื่อแพ็กเกจอื่น แอปของคุณจะมี Play Store 2 ชื่อแยกกัน ทั้งหมด หากคุณใช้ชื่อแพ็กเกจปัจจุบันซ้ำ แอปของคุณจะมี เดียวกันสำหรับทั้ง 2 แพลตฟอร์ม

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

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

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

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

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

ฮาร์ดแวร์

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

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

API สำหรับรถยนต์ใดที่เราจะเข้าถึงได้ และจะเข้าถึงได้อย่างไร

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

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

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

โปรดดูที่รายละเอียดตัวแปลงสัญญาณเสียง ใน Android CDD

รองรับ Widevine DRM ไหม

ได้ Widevine DRM ได้

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

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

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

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

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

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

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

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

  1. เปิด Play Console
  2. เลือกแอป
  3. จากเมนูด้านซ้าย ให้คลิกรุ่น > ตั้งค่า > การตั้งค่าขั้นสูง > รูปแบบของอุปกรณ์
  4. คลิกเพิ่มรูปแบบของอุปกรณ์ > Android Automotive OS จากนั้นทำตาม วิธีการใน Play Console

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

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

ตัวอย่าง

เส้นนำ

บล็อก

วิดีโอ

รายงานปัญหาเกี่ยวกับ Android Automotive OS Media

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

สร้างรายการใหม่

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