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
ในไฟล์ .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
เราขอแนะนำให้คุณเก็บบริการเบราว์เซอร์สื่อไว้ในโมดูลแยกต่างหากที่คุณแชร์ระหว่างแอปโทรศัพท์กับโมดูลยานยนต์ หากใช้แนวทางนี้ คุณต้องอัปเดตโมดูลยานยนต์ให้รวมโมดูลที่แชร์ไว้ด้วย ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
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
หลีกเลี่ยงสิ่งรบกวนในการตั้งค่าและกิจกรรมการลงชื่อเข้าใช้
โปรดตรวจสอบว่าองค์ประกอบ <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
ในทุกคอมโพเนนต์ต่อไปนี้ นอกจากนี้ คุณยังใส่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 จะไม่ใช้
ต้องลงชื่อเข้าใช้เมื่อเริ่มแอป
หากต้องการกำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้ก่อนจึงจะใช้แอปได้ บริการเบราว์เซอร์สื่อของคุณต้องทำสิ่งต่อไปนี้
- ในเมธอด
onLoadChildren()
ของบริการ ให้ส่งผลลัพธ์null
โดยใช้เมธอดsendResult()
- ตั้งค่า
PlaybackStateCompat
ของเซสชันสื่อเป็นSTATE_ERROR
ใช้เมธอดsetState()
ซึ่งจะบอกให้ Android Automotive OS ทราบว่าจะดำเนินการอื่นๆ ไม่ได้จนกว่าจะแก้ไขข้อผิดพลาด - ตั้งค่า
PlaybackStateCompat
รหัสข้อผิดพลาดของเซสชันสื่อเป็นERROR_CODE_AUTHENTICATION_EXPIRED
ซึ่งจะบอก Android Automotive OS ว่าผู้ใช้ต้องตรวจสอบสิทธิ์ - ตั้งค่า
PlaybackStateCompat
ข้อความแสดงข้อผิดพลาดของเซสชันสื่อโดยใช้เมธอดsetErrorMessage()
เนื่องจากข้อความแสดงข้อผิดพลาดนี้แสดงต่อผู้ใช้ ให้แปลข้อความสำหรับภาษาปัจจุบันของผู้ใช้ ตั้งค่า
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 ได้ที่แหล่งข้อมูลเพิ่มเติมต่อไปนี้
ตัวอย่าง
เส้นนำ
- Design for Driving
- การใช้แอปทดสอบตัวควบคุมสื่อ
- การแจ้งเตือนใน Android Automotive OS
- คุณภาพแอป Android สำหรับรถยนต์
บล็อก
วิดีโอ
- วิธีสร้างแอปสื่อสำหรับรถยนต์ (Android Dev Summit ปี 2019)
- วิธีสร้างแอป Android สำหรับรถยนต์ (Google I/O'19)
รายงานปัญหาเกี่ยวกับสื่อใน Android Automotive OS
หากพบปัญหาขณะพัฒนาแอปสื่อสำหรับ Android Automotive OS คุณสามารถรายงานปัญหาได้โดยใช้เครื่องมือติดตามปัญหาของ Google โปรดกรอกข้อมูลที่ขอทั้งหมดในเทมเพลตปัญหา
ก่อนรายงานปัญหาใหม่ โปรดตรวจสอบว่าปัญหาดังกล่าวได้รับการรายงานแล้วในรายการปัญหาหรือไม่ คุณสามารถติดตามและโหวตปัญหาได้โดยคลิกดาวสำหรับปัญหาในเครื่องมือติดตาม ดูข้อมูลเพิ่มเติมได้ที่การติดตามปัญหา