Android Automotive OS อนุญาตให้ผู้ใช้ติดตั้งแอปในรถยนต์ คุณต้องเผยแพร่แอปที่เพิ่มประสิทธิภาพให้ผู้ขับขี่ และเข้ากันได้กับ Android Automotive OS เพื่อเข้าถึงผู้ใช้ในแพลตฟอร์มนี้ คุณสามารถนําโค้ดและทรัพยากรเกือบทั้งหมดมาใช้ในแอป Android Auto ได้ แต่จะต้องสร้างบิลด์แยกต่างหากที่เป็นไปตามข้อกําหนดในหน้านี้
ภาพรวมการพัฒนา
การเพิ่มการรองรับ Android Automotive OS ใช้เวลาเพียงไม่กี่ขั้นตอนตามที่อธิบายไว้ ในส่วนต่อไปนี้
- เปิดใช้ฟีเจอร์ยานยนต์ใน Android Studio
- สร้างโมดูลยานยนต์
- อัปเดตทรัพยากร Dependency ของ Gradle
- ใช้การตั้งค่าและกิจกรรมการลงชื่อเข้าใช้ (ไม่บังคับ)
- อ่านคำแนะนำเกี่ยวกับโฮสต์สื่อ (ไม่บังคับ)
ข้อควรพิจารณาในการออกแบบ
Android Automotive OS จะดูแลการจัดวางเนื้อหาสื่อที่ได้รับจากบริการเบราว์เซอร์สื่อของแอป ซึ่งหมายความว่าแอปจะไม่วาด UI และจะไม่เริ่มกิจกรรมใดๆ เมื่อผู้ใช้เรียกใช้การเล่นสื่อ
หากคุณกำลังใช้การตั้งค่าหรือกิจกรรมการลงชื่อเข้าใช้ กิจกรรมเหล่านี้ต้องปรับให้เหมาะกับยานพาหนะ โปรดดูหลักเกณฑ์การออกแบบ สำหรับ Android Automotive OS ขณะออกแบบพื้นที่เหล่านั้นของแอป
สร้างโปรเจ็กต์
คุณต้องตั้งค่าหลายส่วนของโปรเจ็กต์แอปเพื่อเปิดใช้ การรองรับ Android Automotive OS
เปิดใช้ฟีเจอร์ยานยนต์ใน Android Studio
ใช้ Android Studio 4.0 ขึ้นไปเพื่อให้มั่นใจว่าฟีเจอร์ Automotive OS ทั้งหมดจะ เปิดใช้
สร้างโมดูลยานยนต์
คอมโพเนนต์บางอย่างของ Android Automotive OS เช่น ไฟล์ Manifest มีข้อกำหนดเฉพาะแพลตฟอร์ม สร้างโมดูลที่สามารถแยกโค้ดสำหรับคอมโพเนนต์เหล่านี้ออกจากโค้ดอื่นๆ ในโปรเจ็กต์ เช่น โค้ดที่ใช้สำหรับแอปโทรศัพท์
ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มโมดูลยานยนต์ลงในโปรเจ็กต์
- ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โมดูลใหม่
- เลือกโมดูลยานยนต์ แล้วคลิกถัดไป
- ป้อนชื่อแอปพลิเคชัน/ไลบรารี นี่คือชื่อที่ผู้ใช้เห็นสำหรับ แอปของคุณใน Android Automotive OS
- ป้อนชื่อโมดูล
- ปรับชื่อแพ็กเกจให้ตรงกับแอป
เลือก API 28: Android 9.0 (Pie) สำหรับ SDK ขั้นต่ำ แล้วคลิกถัดไป
รถยนต์ทุกคันที่รองรับ Android Automotive OS จะใช้ Android 9 (API ระดับ 28) ขึ้นไป ดังนั้นการเลือกค่านี้จึงกำหนดเป้าหมายเป็นรถยนต์ที่เข้ากันได้ทั้งหมด
เลือกไม่มีกิจกรรม แล้วคลิกเสร็จสิ้น
หลังจากสร้างโมดูลใน 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 ขององค์ประกอบ <application> เป็น
"audio"
<application
...
android:appCategory="audio" />
ประกาศข้อกำหนดของฟีเจอร์
แอปทั้งหมดที่สร้างขึ้นสำหรับ Android Automotive OS ต้องเป็นไปตามข้อกำหนดบางอย่างจึงจะ จัดจำหน่ายโดยใช้ Google Play ได้ ดูข้อมูลเพิ่มเติมได้ที่ข้อกำหนดของฟีเจอร์ Google Play
ประกาศการรองรับสื่อสำหรับ 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>
อัปเดตการขึ้นต่อกันของ 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 จะส่ง Intent
ACTION_APPLICATION_PREFERENCES ที่บอกให้แอปเริ่มกิจกรรมการตั้งค่า
ส่วนที่เหลือของส่วนนี้จะแสดงวิธีปรับโค้ดจากแอปตัวอย่าง Universal Android Music Player (UAMP) เพื่อใช้กิจกรรมการตั้งค่าสำหรับแอป
หากต้องการเริ่มต้น ให้ดาวน์โหลดโค้ดตัวอย่างโดยทำดังนี้
# Clone the UAMP repositorygit clone https://github.com/android/uamp.git# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
หากต้องการนำกิจกรรมไปใช้ ให้ทำตามขั้นตอนต่อไปนี้
- คัดลอกโฟลเดอร์
automotive/automotive-libไปยังโมดูลยานยนต์ - กำหนดโครงสร้างค่ากำหนดตามที่ระบุใน
automotive/src/main/res/xml/preferences.xml ใช้
PreferenceFragmentCompatเพื่อให้กิจกรรมการตั้งค่าแสดง ดูข้อมูลเพิ่มเติมได้ที่ไฟล์SettingsFragment.ktและSettingsActivity.ktใน UAMP และคู่มือการตั้งค่า Android
เมื่อคุณใช้กิจกรรมการตั้งค่า โปรดพิจารณาแนวทางปฏิบัติแนะนำต่อไปนี้สำหรับการใช้ คอมโพเนนต์บางอย่างในไลบรารีค่ากำหนด
- มีระดับความลึกไม่เกิน 2 ระดับใต้มุมมองหลักใน กิจกรรมการตั้งค่า
- อย่าใช้
DropDownPreferenceโปรดใช้ListPreferenceแทน - องค์ประกอบขององค์กร
PreferenceScreen- ต้องเป็นระดับบนสุดของโครงสร้างค่ากำหนด
PreferenceCategory- ใช้เพื่อจัดกลุ่มออบเจ็กต์
Preferenceเข้าด้วยกัน - ใส่
title
- ใช้เพื่อจัดกลุ่มออบเจ็กต์
- ใส่
keyและtitleในคอมโพเนนต์ต่อไปนี้ทั้งหมด นอกจากนี้ คุณยัง ใส่summaryiconหรือทั้ง 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 จะไม่ใช้
ต้องลงชื่อเข้าใช้เมื่อเริ่มแอป
หากต้องการกำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้ก่อนจึงจะใช้แอปได้ บริการเบราว์เซอร์สื่อ ของคุณต้องทำสิ่งต่อไปนี้
- ในเมธอด
onLoadChildren()ของบริการ ให้ส่งผลลัพธ์nullโดยใช้เมธอดsendResult() - ตั้งค่า
PlaybackStateCompatของเซสชันสื่อเป็นSTATE_ERRORโดยใช้เมธอดsetState()ซึ่งจะบอก Android Automotive OS ว่าไม่สามารถดำเนินการอื่นๆ ได้จนกว่าจะแก้ไขข้อผิดพลาดแล้ว - ตั้งค่ารหัสข้อผิดพลาด
PlaybackStateCompatของเซสชันสื่อเป็นERROR_CODE_AUTHENTICATION_EXPIREDซึ่งจะบอก Android Automotive OS ว่าผู้ใช้ต้องตรวจสอบสิทธิ์ - ตั้งค่า
PlaybackStateCompatข้อความแสดงข้อผิดพลาดของเซสชันสื่อโดยใช้เมธอดsetErrorMessage()เนื่องจากข้อความแสดงข้อผิดพลาดนี้แสดงต่อผู้ใช้ ให้แปลเป็นภาษาท้องถิ่นปัจจุบันของผู้ใช้ ตั้งค่า
PlaybackStateCompatextras ของเซสชันสื่อโดยใช้เมธอด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 มีชุดเครื่องมือแบบฟูลสแต็กที่ช่วยสร้างประสบการณ์การตรวจสอบสิทธิ์ที่ปรับแต่งได้ เครื่องมืออื่นๆ ใช้ประโยชน์จากข้อมูลเข้าสู่ระบบที่มีอยู่ของผู้ใช้หรือเทคโนโลยีอื่นๆ เพื่อช่วยคุณสร้างประสบการณ์การลงชื่อเข้าใช้ที่ราบรื่นสำหรับผู้ใช้
เครื่องมือต่อไปนี้จะช่วยให้คุณสร้างประสบการณ์การลงชื่อเข้าใช้ที่ง่ายขึ้นสำหรับผู้ใช้ที่เคยลงชื่อเข้าใช้ในอุปกรณ์อื่น
- การลงชื่อเข้าใช้และลงชื่อสมัครใช้ด้วย One Tap: หากคุณได้ติดตั้งใช้งาน One Tap สำหรับอุปกรณ์อื่นๆ เช่น แอปโทรศัพท์แล้ว ให้ติดตั้งใช้งานสำหรับแอป Android Automotive OS เพื่อรองรับผู้ใช้ One Tap ที่มีอยู่
- การลงชื่อเข้าใช้ด้วย Google: หากคุณได้ติดตั้งใช้งานการลงชื่อเข้าใช้ด้วย Google สำหรับอุปกรณ์อื่นๆ เช่น แอปโทรศัพท์ ให้ติดตั้งใช้งานการลงชื่อเข้าใช้ด้วย Google สำหรับแอป Android Automotive OS เพื่อรองรับผู้ใช้ที่ลงชื่อเข้าใช้ด้วย Google อยู่แล้ว
- การป้อนข้อความอัตโนมัติด้วย 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 หากต้องการตรวจสอบว่าโฮสต์สื่อรองรับMEDIA_TEMPLATE_V2 Intent หรือไม่ คุณสามารถใช้
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 ที่โฮสต์สื่อรองรับและกรณีการใช้งานเฉพาะของคุณ
| คีย์เพิ่มเติม | ประเภท | คำอธิบาย | การดำเนินการที่รองรับ |
|---|---|---|---|
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 ค้นหา "Jazz" แล้วเล่นรายการแรกจากผลการค้นหา
ในโฮสต์อื่นๆ ทั้งหมด ระบบจะเปิดเฉพาะแอปโฮสต์สื่อและค้นหา "Jazz" โดยให้ผู้ใช้เลือกรายการที่จะเล่นจากผลการค้นหา
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)
รองรับ Deep Link
หากต้องการปรับปรุงประสบการณ์การใช้งานแอปสื่อในอุปกรณ์ Android Automotive OS คุณสามารถเพิ่มการรองรับ Deep Link ลงในแอปได้ ตัวอย่างเช่น การดำเนินการนี้จะช่วยให้ผู้ใช้เปิดแอปได้โดยตรงจากเบราว์เซอร์หรือเมื่อได้รับ URL ที่แชร์จากโทรศัพท์โดยใช้ Quick Share
เพิ่มตัวกรอง Intent ของ Deep Link
หากต้องการแจ้งให้ระบบปฏิบัติการทราบว่าแอปของคุณจัดการ Deep Link ได้ แอปจะต้องมี กิจกรรมที่มีตัวกรอง Intent ที่เหมาะสม ดูคำแนะนำเกี่ยวกับรูปแบบของตัวกรอง Intent ที่ใช้สำหรับ Deep Link ได้ที่เพิ่มตัวกรอง Intent สำหรับ ลิงก์ขาเข้า
โปรดรองรับ Deep Link ทั้งหมดที่แอปบนอุปกรณ์เคลื่อนที่รองรับ หากแอปในรถยนต์รองรับได้อย่างสมเหตุสมผล เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีที่สุด หากแอปมีการตั้งค่าหรือกิจกรรมการลงชื่อเข้าใช้ ควรประกาศตัวกรอง Intent สำหรับการจัดการการตั้งค่าและ Deep Link ของการลงชื่อเข้าใช้ภายใน<activity>องค์ประกอบ Manifest ที่เกี่ยวข้อง สำหรับการเล่นสื่อและ Deep Link ในการเรียกดู คุณ
สามารถใช้กิจกรรม Trampoline ตามที่อธิบายไว้ในส่วนนี้
จัดการ Intent ของ Deep Link
ดูคำแนะนำเกี่ยวกับวิธีอ่านและตอบสนองต่อ Intent ที่ใช้เพื่อเริ่มกิจกรรมของแอปได้ที่อ่านข้อมูลจาก Intent ขาเข้า
จัดการการเล่นสื่อและ Deep Link สำหรับการเรียกดู
เนื่องจากแอปโฮสต์เป็นผู้ดึง 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 Automotive OS
เนื้อหาออฟไลน์
หากเป็นไปได้ ให้รองรับการเล่นแบบออฟไลน์ รถยนต์ที่ใช้ Android Automotive OS ควรมีการเชื่อมต่ออินเทอร์เน็ตของตัวเอง ซึ่งหมายความว่า แพ็กเกจอินเทอร์เน็ตจะรวมอยู่ในค่าใช้จ่ายของรถยนต์หรือผู้ใช้เป็นผู้ชำระเงิน อย่างไรก็ตาม คาดว่ารถยนต์จะมีการเชื่อมต่อที่หลากหลายกว่าอุปกรณ์เคลื่อนที่ ด้วย
สิ่งที่คุณควรทราบเมื่อพิจารณากลยุทธ์การสนับสนุนแบบออฟไลน์มีดังนี้
- เวลาที่ดีที่สุดในการดาวน์โหลดเนื้อหาคือขณะที่ใช้แอป
- อย่าคิดว่าจะมี Wi-Fi ให้ใช้ รถอาจไม่อยู่ในระยะ Wi-Fi หรือ OEM อาจปิดใช้ Wi-Fi เพื่อใช้เครือข่ายมือถือแทน
- แม้ว่าคุณจะแคชเนื้อหาที่คาดว่าผู้ใช้จะใช้ได้ แต่เราขอแนะนำให้คุณอนุญาตให้ผู้ใช้เปลี่ยนลักษณะการทำงานนี้ผ่าน กิจกรรมการตั้งค่าของคุณ
- พื้นที่ดิสก์ในรถยนต์จะแตกต่างกันไป ดังนั้นให้ผู้ใช้มีวิธีลบ เนื้อหาที่ดาวน์โหลดไว้ เช่น ผ่านตัวเลือกใน กิจกรรมการตั้งค่า
การรองรับ WebView
Android Automotive OS รองรับ WebView แต่จะอนุญาตให้ใช้เฉพาะ การตั้งค่าและกิจกรรมการลงชื่อเข้าใช้ของคุณเท่านั้น กิจกรรมที่ใช้ WebView ต้องมี ความสามารถในการ "ปิด" หรือ "กลับ" นอก WebView
ตัวอย่างกรณีการใช้งาน 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 คุณจึงนำชื่อแพ็กเกจจากแอปบนอุปกรณ์เคลื่อนที่มาใช้ซ้ำหรือสร้าง ชื่อแพ็กเกจใหม่ได้ หากใช้ชื่อแพ็กเกจอื่น แอปจะมีข้อมูล Play Store แยกกัน 2 รายการ หากใช้ชื่อแพ็กเกจปัจจุบันซ้ำ แอปจะมีข้อมูล เดียวในทั้ง 2 แพลตฟอร์ม
ซึ่งส่วนใหญ่เป็นการตัดสินใจทางธุรกิจ ตัวอย่างเช่น หากคุณมีทีมหนึ่ง ที่ทำงานในแอปบนอุปกรณ์เคลื่อนที่ และอีกทีมที่ทำงานในแอป Android Automotive OS คุณอาจต้องใช้ชื่อแพ็กเกจแยกกันและ ให้แต่ละทีมจัดการข้อมูล Play Store ของตนเอง ความพยายามทางเทคนิคที่จำเป็นในการใช้วิธีการทั้ง 2 นั้นไม่แตกต่างกันมาก
ตารางต่อไปนี้จะสรุปความแตกต่างที่สําคัญอื่นๆ ระหว่างการใช้ชื่อแพ็กเกจปัจจุบันกับชื่อแพ็กเกจใหม่
| ฟีเจอร์ | ชื่อแพ็กเกจเดียวกัน | ชื่อแพ็กเกจใหม่ |
|---|---|---|
| ข้อมูลสินค้าใน Store | โสด | หลายรายการ |
| การติดตั้งแบบมิเรอร์ | ใช่: "ติดตั้งแอปซ้ำอย่างรวดเร็ว" ระหว่างวิซาร์ดการตั้งค่า | ไม่ |
| กระบวนการตรวจสอบของ Play Store | การบล็อกรีวิว: หากรีวิวไม่ผ่านสำหรับ APK รายการใดรายการหนึ่ง ระบบจะบล็อก APK อื่นๆ ที่ส่งในรุ่นเดียวกัน | รีวิวแต่ละรายการ |
| สถิติ เมตริก และ Vitals | รวม: คุณสามารถกรองข้อมูลเฉพาะยานยนต์ได้ | แยก |
| การจัดทำดัชนีและการจัดอันดับการค้นหา | สร้างจากสถานะปัจจุบัน | ไม่มีการยกยอด |
| การผสานรวมกับแอปอื่นๆ | ไม่น่าจะต้องเปลี่ยนแปลงใดๆ หากมีการแชร์รหัสสื่อระหว่าง APK ทั้ง 2 รายการ | อาจต้องอัปเดตแอปที่เกี่ยวข้อง เช่น สำหรับการเล่น URI ด้วย Google Assistant |
คำถามที่พบบ่อย
ดูคำตอบสำหรับคำถามที่พบบ่อยเกี่ยวกับ Android Automotive OS ได้ในส่วนต่อไปนี้
ฮาร์ดแวร์
แอปของฉันจะเข้าถึงไมโครโฟนได้ไหม
สำหรับแอปที่กำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) ขึ้นไป โปรดดูเอกสารประกอบเกี่ยวกับการแชร์อินพุตเสียง ซึ่งไม่สามารถทำได้ใน API ระดับ 29 ขึ้นไป
เราจะเข้าถึง API ของรถยนต์ใดได้บ้างและอย่างไร
คุณจะใช้ได้เฉพาะ API ที่ OEM เปิดเผย เรากำลัง พัฒนากระบวนการเพื่อกำหนดมาตรฐานวิธีเข้าถึง API เหล่านี้
แอปสามารถเข้าถึง Car API ได้โดยใช้ SetProperty()
และ GetProperty()
ใน CarPropertyManager
ดูซอร์สโค้ด
หรือเอกสารอ้างอิงเพื่อดูรายการพร็อพเพอร์ตี้ทั้งหมดที่ใช้ได้
หากพร็อพเพอร์ตี้มีคำอธิบายประกอบ
ด้วย @SystemApi จะจำกัดไว้สำหรับแอปของระบบที่โหลดไว้ล่วงหน้า
ระบบรองรับตัวแปลงรหัสเสียงประเภทใดบ้าง
ดูรายละเอียดตัวแปลงรหัสเสียง ใน CDD ของ Android
ระบบรองรับ Widevine DRM ไหม
ได้ DRM ของ Widevine ได้รับการรองรับ
การพัฒนาและการทดสอบ
มีข้อจำกัดหรือคำแนะนำในการใช้ SDK และไลบรารีของบุคคลที่สามไหม
เราไม่มีหลักเกณฑ์เฉพาะเกี่ยวกับการใช้ SDK และไลบรารีของบุคคลที่สาม หากเลือกใช้ SDK และไลบรารีของบุคคลที่สาม คุณยังคงมีหน้าที่รับผิดชอบ ในการปฏิบัติตามข้อกำหนดด้านคุณภาพของแอปในรถยนต์ทั้งหมด
ฉันใช้บริการที่ทำงานอยู่เบื้องหน้าได้ไหม
กรณีการใช้งานที่อนุญาตสำหรับบริการที่ทำงานอยู่เบื้องหน้าคือการดาวน์โหลดเนื้อหาเพื่อใช้แบบออฟไลน์เท่านั้น หากมีกรณีการใช้งานอื่นสำหรับบริการที่ทำงานอยู่เบื้องหน้าที่คุณต้องการให้รองรับ โปรดติดต่อเราโดยใช้กลุ่มสนทนา Android Automotive OS
การเผยแพร่แอป Android Automotive OS
ฉันจะเผยแพร่แอป Android Automotive OS โดยใช้ Google Play Console ได้อย่างไร
ดูรายละเอียดเกี่ยวกับวิธีเผยแพร่แอป Android Automotive OS โดยใช้ Google Play Console ได้ที่เผยแพร่ไปยังรถยนต์
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Android Automotive OS ได้ที่แหล่งข้อมูลเพิ่มเติมต่อไปนี้
ตัวอย่าง
คำแนะนำ
- Design for Driving
- การใช้แอปทดสอบตัวควบคุมสื่อ
- การแจ้งเตือนใน Android Automotive OS
- คุณภาพแอป Android สำหรับรถยนต์
บล็อก
- ข้อมูลอัปเดตเกี่ยวกับ Android Automotive OS สำหรับนักพัฒนาแอป
- การพัฒนาแอปสำหรับ Android Automotive OS
วิดีโอ
- วิธีสร้างแอปสื่อสำหรับรถยนต์ (Android Dev Summit '19)
- วิธีสร้างแอป Android สำหรับรถยนต์ (Google I/O'19)
รายงานปัญหาเกี่ยวกับสื่อใน Android Automotive OS
หากพบปัญหาขณะพัฒนาแอปสื่อสำหรับ Android Automotive OS คุณสามารถรายงานปัญหาได้โดยใช้ เครื่องมือติดตามปัญหาของ Google โปรดกรอกข้อมูลที่ขอทั้งหมดในเทมเพลตปัญหา
ก่อนที่จะยื่นปัญหาใหม่ โปรดตรวจสอบว่ามีการรายงานปัญหาดังกล่าวในรายการปัญหาแล้วหรือไม่ คุณสามารถติดตามและโหวตปัญหาได้โดยคลิกดาวสำหรับปัญหาใน เครื่องมือติดตาม ดูข้อมูลเพิ่มเติมได้ที่ การติดตามปัญหา