Android Automotive OS อนุญาตให้ผู้ใช้ติดตั้งแอปในรถยนต์ หากต้องการเข้าถึง บนแพลตฟอร์มนี้ คุณจะต้องเผยแพร่แอปที่เพิ่มประสิทธิภาพให้ผู้ขับขี่ ซึ่ง ใช้ได้กับ Android Automotive OS คุณสามารถนำโค้ดเกือบทั้งหมดมาใช้ซ้ำ ทรัพยากรในแอป Android Auto ของคุณได้ แต่คุณต้องสร้างบิลด์แยกต่างหากที่ เป็นไปตามข้อกำหนดในหน้านี้
ภาพรวมการพัฒนา
การเพิ่มการรองรับ Android Automotive OS สามารถทำได้ใน 2-3 ขั้นตอนตามที่อธิบายไว้ ในหัวข้อต่อไปนี้
- เปิดใช้ฟีเจอร์ Automotive ใน Android Studio
- สร้างโมดูลยานยนต์
- อัปเดตทรัพยากร Dependency ของ Gradle
- (ไม่บังคับ) ใช้การตั้งค่าและกิจกรรมการลงชื่อเข้าใช้
- (ไม่บังคับ) อ่านคําแนะนําของโฮสต์สื่อ
ข้อควรพิจารณาในการออกแบบ
Android Automotive OS จะทำหน้าที่จัดวางเนื้อหาสื่อ ได้รับจากบริการเบราว์เซอร์สื่อของแอป ซึ่งหมายความว่าแอปของคุณไม่ได้วาด UI และไม่ได้เริ่มต้น กิจกรรมของคุณเมื่อผู้ใช้ทริกเกอร์การเล่นสื่อ
หากคุณใช้การตั้งค่าหรือกิจกรรมการลงชื่อเข้าใช้ กิจกรรมเหล่านี้จะต้องเพิ่มประสิทธิภาพสำหรับยานพาหนะ ดูหลักเกณฑ์ในการออกแบบ สำหรับ Android Automotive OS ขณะออกแบบส่วนต่างๆ ของแอป
ตั้งค่าโปรเจ็กต์
คุณต้องตั้งค่าหลายส่วนในโปรเจ็กต์ของแอปเพื่อเปิดใช้ รองรับ Android Automotive OS
เปิดใช้ฟีเจอร์ Automotive ใน Android Studio
ใช้ Android Studio 4.0 ขึ้นไปเพื่อให้ฟีเจอร์ Automotive OS ทั้งหมด เปิดอยู่
สร้างโมดูลยานยนต์
คอมโพเนนต์บางอย่างของ Android Automotive OS เช่น ไฟล์ Manifest ข้อกำหนดเฉพาะแพลตฟอร์ม สร้างโมดูลที่สามารถเก็บ สำหรับคอมโพเนนต์เหล่านี้โดยแยกจากโค้ดอื่นๆ ในโปรเจ็กต์ของคุณ เช่น รหัสที่ใช้สำหรับแอปโทรศัพท์ของคุณ
ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มโมดูลยานยนต์ลงในโปรเจ็กต์
- ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โมดูลใหม่
- เลือก Automotive Module แล้วคลิก Next
- ป้อนชื่อแอปพลิเคชัน/ไลบรารี นี่คือชื่อที่ผู้ใช้จะเห็น แอปของคุณใน 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="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 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()
ของ การใช้งาน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 ต้องทำดังต่อไปนี้:
- ในเมธอด
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 จะมีชุดเครื่องมือเต็มรูปแบบที่สามารถ ช่วยให้คุณสร้างประสบการณ์การตรวจสอบสิทธิ์ที่ปรับแต่งได้ ใช้ประโยชน์จากเครื่องมืออื่นๆ ข้อมูลเข้าสู่ระบบที่มีอยู่ของผู้ใช้หรือเทคโนโลยีอื่นๆ ที่จะช่วยให้คุณสร้าง การลงชื่อเข้าใช้สำหรับผู้ใช้
เครื่องมือต่อไปนี้จะช่วยให้คุณสร้างการลงชื่อเข้าใช้ได้ง่ายขึ้น สำหรับผู้ใช้ที่เคยลงชื่อเข้าใช้ในอุปกรณ์เครื่องอื่นก่อนหน้านี้
- การลงชื่อเข้าใช้และลงชื่อสมัครใช้ด้วย 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 รูปแบบของอุปกรณ์ โปรดทำตามขั้นตอนต่อไปนี้
- เปิด Play Console
- เลือกแอป
- จากเมนูด้านซ้าย ให้คลิกรุ่น > ตั้งค่า > การตั้งค่าขั้นสูง > รูปแบบของอุปกรณ์
- คลิกเพิ่มรูปแบบของอุปกรณ์ > Android Automotive OS จากนั้นทำตาม วิธีการใน Play Console
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Android Automotive OS ได้ในหัวข้อต่อไปนี้ ที่ไม่ซับซ้อน
ตัวอย่าง
เส้นนำ
- ออกแบบสำหรับการขับขี่
- การใช้แอปทดสอบตัวควบคุมสื่อ
- การแจ้งเตือนใน Android Automotive OS
- คุณภาพแอป Android สำหรับรถยนต์
บล็อก
วิดีโอ
- วิธีสร้างแอปสื่อสำหรับรถยนต์ (Android Dev Summit ปี 2019)
- วิธีสร้างแอป Android สำหรับรถยนต์ (Google I/O'19)
รายงานปัญหาเกี่ยวกับ Android Automotive OS Media
หากคุณพบปัญหาขณะพัฒนาแอปสื่อสำหรับ Android Automotive คุณสามารถรายงานด้วยการใช้ เครื่องมือติดตามปัญหาของ Google ตรวจสอบว่าได้กรอกข้อมูลที่ขอทั้งหมดในเทมเพลตของปัญหา
ก่อนที่จะส่งปัญหาใหม่ ให้ตรวจสอบว่ามีการรายงานปัญหาดังกล่าวในปัญหาแล้วหรือยัง รายการ คุณสามารถสมัครรับข้อมูลและโหวตปัญหาโดยคลิกดาวของปัญหาใน แท็กติดตาม สำหรับข้อมูลเพิ่มเติม โปรดดู การสมัครรับปัญหา