หน้านี้แสดงรายละเอียดฟีเจอร์ต่างๆ ของคลังแอปรถยนต์ที่คุณใช้ได้ เพื่อใช้ฟังก์ชันการทำงานของแอปนำทางแบบเลี้ยวต่อเลี้ยว
ประกาศการรองรับการนำทางในไฟล์ Manifest
แอปการนำทางต้องประกาศ androidx.car.app.category.NAVIGATION
หมวดหมู่แอปสำหรับรถยนต์ในความตั้งใจ
ตัวกรองของ CarAppService
:
<application>
...
<service
...
android:name=".MyNavigationCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
<category android:name="androidx.car.app.category.NAVIGATION"/>
</intent-filter>
</service>
...
</application>
รองรับ Intent ในการไปยังส่วนต่างๆ
เพื่อรองรับ Intent เพื่อไปยังส่วนต่างๆ ของแอป รวมถึงแอปที่มาจาก
Google Assistant โดยใช้คำสั่งเสียง แอปของคุณต้องจัดการ
CarContext.ACTION_NAVIGATE
ความตั้งใจ
Session.onCreateScreen
และ
Session.onNewIntent
ดูเอกสารประกอบเกี่ยวกับ
CarContext.startCarApp
เพื่อดูรายละเอียดเกี่ยวกับรูปแบบของ Intent
เข้าถึงเทมเพลตการนำทาง
แอปการนำทางสามารถเข้าถึงเทมเพลตต่อไปนี้ ซึ่งแสดงแพลตฟอร์มใน พื้นหลังที่มีแผนที่ และระหว่างการนำทางที่ใช้งานอยู่ ให้เลี้ยวต่อเลี้ยว เส้นทาง
NavigationTemplate
: จะแสดงข้อมูลและค่าประมาณการเดินทางที่สามารถเลือกได้ระหว่างการนำทางที่ใช้งานอยู่MapWithContentTemplate
: เทมเพลตที่อนุญาตให้แอปแสดงชิ้นส่วนแผนที่ที่มีเนื้อหาบางประเภท (สำหรับ เช่น รายการ) เนื้อหามักจะแสดงเป็นการวางซ้อนที่ด้านบนของ ชิ้นส่วนแผนที่ โดยแผนที่นั้นสามารถมองเห็นได้และพื้นที่ที่มั่นคงซึ่งปรับให้เข้ากับเนื้อหา
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีออกแบบอินเทอร์เฟซผู้ใช้ของแอปการนำทางโดยใช้ เทมเพลตเหล่านี้ได้ที่แอปการนำทาง
ในการเข้าถึงเทมเพลตการนำทาง แอปของคุณต้องประกาศ
สิทธิ์ androidx.car.app.NAVIGATION_TEMPLATES
ใน
ไฟล์ AndroidManifest.xml
:
<manifest ...>
...
<uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>
...
</manifest>
ซึ่งต้องได้รับสิทธิ์เพิ่มเติมเพื่อวาดแผนที่
ย้ายข้อมูลไปยัง MapWithContentTemplate
เริ่มที่ Car App API ระดับ 7
MapTemplate
PlaceListNavigationTemplate
,
และ RoutePreviewNavigationTemplate
เลิกใช้งานแล้ว ระบบจะยังคงรองรับเทมเพลตที่เลิกใช้งานแล้ว แต่
ขอแนะนำให้ย้ายข้อมูลไปยัง MapWithContentTemplate
คุณนำฟังก์ชันการทำงานจากเทมเพลตเหล่านี้ไปใช้ได้
โดยใช้ MapWithContentTemplate
ดูตัวอย่างต่อไปนี้
เทมเพลตแผนที่
Kotlin
// MapTemplate (deprecated) val template = MapTemplate.Builder() .setPane(paneBuilder.build()) .setActionStrip(actionStrip) .setHeader(header) .setMapController(mapController) .build() // MapWithContentTemplate val template = MapWithContentTemplate.Builder() .setContentTemplate( PaneTemplate.Builder(paneBuilder.build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController(mapController) .build()
Java
// MapTemplate (deprecated) MapTemplate template = new MapTemplate.Builder() .setPane(paneBuilder.build()) .setActionStrip(actionStrip) .setHeader(header) .setMapController(mapController) .build(); // MapWithContentTemplate MapWithContentTemplate template = new MapWithContentTemplate.Builder() .setContentTemplate(new PaneTemplate.Builder(paneBuilder.build()) .setHeader(header) build()) .setActionStrip(actionStrip) .setMapController(mapController) .build();
เทมเพลตการนำทางของ PlaceList
Kotlin
// PlaceListNavigationTemplate (deprecated) val template = PlaceListNavigationTemplate.Builder() .setItemList(itemListBuilder.build()) .setHeader(header) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build() // MapWithContentTemplate val template = MapWithContentTemplate.Builder() .setContentTemplate( ListTemplate.Builder() .setSingleList(itemListBuilder.build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController( MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build()
Java
// PlaceListNavigationTemplate (deprecated) PlaceListNavigationTemplate template = new PlaceListNavigationTemplate.Builder() .setItemList(itemListBuilder.build()) .setHeader(header) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build(); // MapWithContentTemplate MapWithContentTemplate template = new MapWithContentTemplate.Builder() .setContentTemplate(new ListTemplate.Builder() .setSingleList(itemListBuilder.build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController(new MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build();
RoutePreviewNavTemplate
Kotlin
// RoutePreviewNavigationTemplate (deprecated) val template = RoutePreviewNavigationTemplate.Builder() .setItemList( ItemList.Builder() .addItem( Row.Builder() .setTitle(title) .build()) .build()) .setHeader(header) .setNavigateAction( Action.Builder() .setTitle(actionTitle) .setOnClickListener { ... } .build()) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build() // MapWithContentTemplate val template = MapWithContentTemplate.Builder() .setContentTemplate( ListTemplate.Builder() .setSingleList( ItemList.Builder() .addItem( Row.Builder() .setTitle(title) .addAction( Action.Builder() .setTitle(actionTitle) .setOnClickListener { ... } .build()) .build()) .build()) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController( MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build()
Java
// RoutePreviewNavigationTemplate (deprecated) RoutePreviewNavigationTemplate template = new RoutePreviewNavigationTemplate.Builder() .setItemList(new ItemList.Builder() .addItem(new Row.Builder() .setTitle(title)) .build()) .build()) .setHeader(header) .setNavigateAction(new Action.Builder() .setTitle(actionTitle) .setOnClickListener(() -> { ... }) .build()) .setActionStrip(actionStrip) .setMapActionStrip(mapActionStrip) .build(); // MapWithContentTemplate MapWithContentTemplate template = new MapWithContentTemplate.Builder() .setContentTemplate(new ListTemplate.Builder() .setSingleList(new ItemList.Builder() .addItem(new Row.Builder() .setTitle(title)) .addAction(new Action.Builder() .setTitle(actionTitle) .setOnClickListener(() -> { ... }) .build()) .build()) .build())) .setHeader(header) .build()) .setActionStrip(actionStrip) .setMapController(new MapController.Builder() .setMapActionStrip(mapActionStrip) .build()) .build();
สื่อสารข้อมูลเมตาของการนำทาง
แอปการนำทางต้องสื่อสารข้อมูลเมตาการนำทางเพิ่มเติมกับ เป็นโฮสต์ โฮสต์ใช้ข้อมูลเพื่อให้ข้อมูลแก่ เครื่องเล่นวิทยุของรถยนต์และเพื่อป้องกันไม่ให้แอปพลิเคชันการนำทางชนกัน ทรัพยากรที่แชร์ร่วมกัน
ข้อมูลเมตาการนำทางมีให้ผ่าน
NavigationManager
ที่บริการรถยนต์เข้าถึงได้จาก
CarContext
:
Kotlin
val navigationManager = carContext.getCarService(NavigationManager::class.java)
Java
NavigationManager navigationManager = carContext.getCarService(NavigationManager.class);
เริ่ม สิ้นสุด หรือหยุดการนำทาง
สำหรับโฮสต์ในการจัดการแอปนำทางหลายรายการ กำหนดเส้นทางการแจ้งเตือน
และข้อมูลคลัสเตอร์รถยนต์ ลูกค้าต้องรับรู้สถานะปัจจุบันของ
การนำทาง เมื่อผู้ใช้เริ่มการนำทาง ให้โทร
NavigationManager.navigationStarted
ในทำนองเดียวกัน เมื่อการนำทางสิ้นสุดลง เช่น เมื่อผู้ใช้มาถึง
ปลายทาง หรือผู้ใช้ยกเลิกการนำทาง
NavigationManager.navigationEnded
โทรเฉพาะ NavigationManager.navigationEnded
เมื่อผู้ใช้นำทางเสร็จแล้ว เช่น หากคุณต้องคำนวณใหม่
ระหว่างการเดินทาง ให้ใช้
Trip.Builder.setLoading(true)
แทน
ในบางครั้ง ผู้จัดการประชุมต้องใช้แอปเพื่อหยุดการนำทางและการโทร
onStopNavigation
ใน
NavigationManagerCallback
จากแอปของคุณผ่าน
NavigationManager.setNavigationManagerCallback
แอปจะต้องหยุดการออกข้อมูลการเลี้ยวถัดไปในหน้าจอของคลัสเตอร์
การแจ้งเตือนการนำทาง และการนำทางด้วยเสียง
อัปเดตข้อมูลการเดินทาง
ระหว่างการนำทางที่ใช้งานอยู่ โทร
NavigationManager.updateTrip
ข้อมูลที่ระบุในการโทรนี้สามารถใช้โดยคลัสเตอร์ของรถและ
หน้าจอการแจ้งเตือน ขึ้นอยู่กับยานพาหนะที่ขับอยู่ ไม่ใช่ทั้งหมด
ข้อมูลที่แสดงต่อผู้ใช้
เช่น Desktop Head Unit (DHU) จะแสดง
Step
ได้เพิ่มลงใน
Trip
แต่ไม่แสดง
Destination
การวาดไปยังจอแสดงผลคลัสเตอร์
หากต้องการมอบประสบการณ์สมจริงที่สุดให้แก่ผู้ใช้ คุณอาจต้องทำมากกว่า การแสดงข้อมูลเมตาพื้นฐานบนจอแสดงผลของคลัสเตอร์รถยนต์ ตั้งแต่ Car App API ระดับ 6 แอปนำทางจะมีตัวเลือกในการแสดงผล เนื้อหาของตนเองโดยตรงบนจอคลัสเตอร์ (ในยานพาหนะที่รองรับ) โดยมี ข้อจำกัดต่อไปนี้
- คลัสเตอร์ Display API ไม่รองรับการควบคุมอินพุต
- การแสดงคลัสเตอร์ควรแสดงเฉพาะชิ้นส่วนแผนที่เท่านั้น การนำทางตามเส้นทางที่ใช้งานอยู่ (ไม่บังคับ) แสดงบนชิ้นส่วนเหล่านี้
- API การแสดงผลคลัสเตอร์รองรับเฉพาะการใช้
NavigationTemplate
- จอแสดงผลคลัสเตอร์อาจไม่ได้แสดงทั้งหมดอย่างสอดคล้องกัน ซึ่งต่างจากจอแสดงผลหลัก
NavigationTemplate
องค์ประกอบ UI เช่น วิธีการแบบเลี้ยวต่อเลี้ยว เวลาถึงโดยประมาณ การ์ด และการดำเนินการ ชิ้นส่วนแผนที่เป็น UI เดียวที่แสดงอย่างสอดคล้องกัน
- จอแสดงผลคลัสเตอร์อาจไม่ได้แสดงทั้งหมดอย่างสอดคล้องกัน ซึ่งต่างจากจอแสดงผลหลัก
ประกาศการรองรับคลัสเตอร์
หากต้องการให้แอปพลิเคชันโฮสต์ทราบว่าแอปของคุณรองรับการแสดงผลในคลัสเตอร์
จอแสดงผล คุณต้องเพิ่ม androidx.car.app.category.FEATURE_CLUSTER
<category>
ไปยัง <intent-filter>
ของ CarAppService
ตามที่แสดงใน
ข้อมูลโค้ดต่อไปนี้
<application> ... <service ... android:name=".MyNavigationCarAppService" android:exported="true"> <intent-filter> <action android:name="androidx.car.app.CarAppService" /> <category android:name="androidx.car.app.category.NAVIGATION"/> <category android:name="androidx.car.app.category.FEATURE_CLUSTER"/> </intent-filter> </service> ... </application>
วงจรการจัดการสถานะ
เริ่มต้นด้วย API ระดับ 6 ซึ่งเป็นแอปสำหรับรถยนต์
วงจร
ยังคงเหมือนเดิม แต่ตอนนี้ CarAppService::onCreateSession
จะใช้พารามิเตอร์
ประเภท SessionInfo
ที่ระบุ
ข้อมูลเพิ่มเติมเกี่ยวกับSession
ที่สร้างขึ้น (ได้แก่ จอแสดงผล
และชุดของเทมเพลตที่สนับสนุน)
แอปมีตัวเลือกในการใช้คลาส Session
เดียวกันเพื่อจัดการ
คลัสเตอร์และจอแสดงผลหลัก หรือสร้างSessions
เฉพาะสำหรับจอแสดงผลเพื่อปรับแต่ง
บนจอแสดงผลแต่ละจอ (ดังที่แสดงในข้อมูลโค้ดต่อไปนี้)
Kotlin
override fun onCreateSession(sessionInfo: SessionInfo): Session { return if (sessionInfo.displayType == SessionInfo.DISPLAY_TYPE_CLUSTER) { ClusterSession() } else { MainDisplaySession() } }
Java
@Override @NonNull public Session onCreateSession(@NonNull SessionInfo sessionInfo) { if (sessionInfo.getDisplayType() == SessionInfo.DISPLAY_TYPE_CLUSTER) { return new ClusterSession(); } else { return new MainDisplaySession(); } }
โดยไม่มีการรับประกันว่าจะให้จอแสดงผลคลัสเตอร์พร้อมใช้งานเมื่อใด และ
เป็นไปได้ที่คลัสเตอร์ Session
จะเป็น Session
เพียงรายการเดียว (สำหรับ
เช่น ผู้ใช้สลับจอแสดงผลหลักไปยังแอปอื่นขณะที่แอปของคุณ
ที่กำลังนำทางอยู่) "มาตรฐาน" ข้อตกลงคือแอปได้รับการควบคุม
แสดงคลัสเตอร์หลังจากที่มีการเพิ่มประสิทธิภาพ NavigationManager::navigationStarted
แล้วเท่านั้น
โทรออก อย่างไรก็ตาม แอปอาจมีจอแสดงผลคลัสเตอร์
ขณะที่ไม่มีการนำทางที่ใช้งานอยู่ หรือไม่ต้องระบุคลัสเตอร์
จอแสดงผล ทั้งนี้ขึ้นอยู่กับแอปของคุณที่จะจัดการกับสถานการณ์เหล่านี้ด้วยการแสดงผล
สถานะไม่มีการใช้งานของชิ้นส่วนแผนที่
โฮสต์สร้าง Binder และอินสแตนซ์ CarContext
อินสแตนซ์ต่อ Session
ช่วงเวลานี้
หมายความว่าเมื่อใช้เมธอดอย่าง ScreenManager::push
หรือ
Screen::invalidate
เฉพาะ Session
ที่ระบบเรียกชื่อดังกล่าวเท่านั้น
ที่ได้รับผลกระทบ แอปควรสร้างช่องทางการสื่อสารของตนเองระหว่าง
หากจำเป็นต้องมีการสื่อสารข้าม Session
(ตัวอย่างเช่น โดยการใช้
broadcasts, Singleton หรืออะไรก็ได้
อื่นๆ)
การสนับสนุนคลัสเตอร์การทดสอบ
คุณทดสอบการใช้งานได้ทั้งใน Android Auto และ Android Automotive OS สำหรับ Android Auto คุณจะดำเนินการนี้ได้โดยการกำหนดค่าเครื่องเสียงบนเดสก์ท็อปเพื่อจำลอง จอแสดงผลคลัสเตอร์รอง สำหรับ Android Automotive OS อิมเมจระบบทั่วไปสำหรับ API ระดับ 30 ขึ้นไปจะจำลอง Display แบบคลัสเตอร์
ปรับแต่ง TravelIndex ด้วยข้อความหรือไอคอน
หากต้องการปรับค่าประมาณการเดินทางด้วยข้อความ ไอคอน หรือทั้ง 2 อย่าง ให้ใช้
TravelEstimate.Builder
ของชั้นเรียน
setTripIcon
หรือ
setTripText
NavigationTemplate
ใช้
TravelEstimate
เพื่อกำหนดข้อความและไอคอนไว้ข้างหรือแทนที่เวลาโดยประมาณ
ของการถึง เวลาที่เหลือ และระยะทางที่เหลือ
![](https://developer.android.com/training/cars/images/eta-custom-IconText.png?authuser=9&hl=th)
ข้อมูลโค้ดต่อไปนี้ใช้ setTripIcon
และ setTripText
เพื่อปรับแต่งพารามิเตอร์
การเดินทางโดยประมาณ:
Kotlin
TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...)) ... .setTripIcon(CarIcon.Builder(...).build()) .setTripText(CarText.create(...)) .build()
Java
new TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...)) ... .setTripIcon(CarIcon.Builder(...).build()) .setTripText(CarText.create(...)) .build();
แสดงการแจ้งเตือนแบบเลี้ยวต่อเลี้ยว
ให้คำแนะนำการนำทางแบบเลี้ยวต่อเลี้ยว (TBT) โดยใช้ การแจ้งเตือนการนำทางที่อัปเดต ถือว่าเป็นการนำทาง การแจ้งเตือนในหน้าจอของรถ เครื่องมือสร้างการแจ้งเตือนของคุณจะต้อง ดังต่อไปนี้:
- ทำเครื่องหมายการแจ้งเตือนว่าดำเนินอยู่ด้วย
NotificationCompat.Builder.setOngoing
- ตั้งหมวดหมู่ของการแจ้งเตือนเป็น
Notification.CATEGORY_NAVIGATION
- ขยายการแจ้งเตือนด้วย
CarAppExtender
การแจ้งเตือนการนำทางจะแสดงในวิดเจ็ตรถไฟที่ด้านล่างของ
หน้าจอของรถ หากตั้งค่าระดับความสำคัญของการแจ้งเตือนเป็น
IMPORTANCE_HIGH
ทั้งยังแสดงเป็นการแจ้งเตือนล่วงหน้า (HUN) ด้วย
หากไม่ได้ตั้งค่าความสำคัญด้วยแอตทริบิวต์
CarAppExtender.Builder.setImportance
เมธอด
ความสำคัญของช่องทางการแจ้งเตือน
แอปสามารถตั้งค่า PendingIntent
ใน
CarAppExtender
ที่
จะส่งไปยังแอปเมื่อผู้ใช้แตะ HUN หรือวิดเจ็ตราง
ถ้า
NotificationCompat.Builder.setOnlyAlertOnce
ถูกเรียกด้วยค่า true
ซึ่งเป็นการแจ้งเตือนการแจ้งเตือนที่มีความสำคัญสูงเท่านั้น
ครั้งหนึ่งใน HUN
ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้างการแจ้งเตือนการนำทาง
Kotlin
NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) ... .setOnlyAlertOnce(true) .setOngoing(true) .setCategory(NotificationCompat.CATEGORY_NAVIGATION) .extend( CarAppExtender.Builder() .setContentTitle(carScreenTitle) ... .setContentIntent( PendingIntent.getBroadcast( context, ACTION_OPEN_APP.hashCode(), Intent(ACTION_OPEN_APP).setComponent( ComponentName(context, MyNotificationReceiver::class.java)), 0)) .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH) .build()) .build()
Java
new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) ... .setOnlyAlertOnce(true) .setOngoing(true) .setCategory(NotificationCompat.CATEGORY_NAVIGATION) .extend( new CarAppExtender.Builder() .setContentTitle(carScreenTitle) ... .setContentIntent( PendingIntent.getBroadcast( context, ACTION_OPEN_APP.hashCode(), new Intent(ACTION_OPEN_APP).setComponent( new ComponentName(context, MyNotificationReceiver.class)), 0)) .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH) .build()) .build();
อัปเดตการแจ้งเตือนเกี่ยวกับระยะทาง ( TBT) เป็นประจำ
การเปลี่ยนแปลง ซึ่งจะอัปเดตวิดเจ็ตรถไฟ และแสดงเฉพาะการแจ้งเตือนเป็น HUN
คุณควบคุมลักษณะการทำงานของ HUN ได้โดยตั้งค่าความสำคัญของการแจ้งเตือนด้วย
CarAppExtender.Builder.setImportance
การกำหนดความสำคัญเป็น
IMPORTANCE_HIGH
แสดง HUN การเกริ่นนำ
เป็นค่าอื่น จะอัปเดตวิดเจ็ตรถไฟเท่านั้น
รีเฟรชเนื้อหา PlaceListnavigationTemplate
คุณสามารถอนุญาตให้คนขับรีเฟรชเนื้อหาได้ด้วยการแตะปุ่มขณะท่องเว็บ
รายการสถานที่ที่สร้างด้วย
PlaceListNavigationTemplate
หากต้องการเปิดใช้การรีเฟรชรายการ ให้ใช้
OnContentRefreshListener
ของอินเทอร์เฟซ
onContentRefreshRequested
วิธีการและการใช้งาน
PlaceListNavigationTemplate.Builder.setOnContentRefreshListener
เพื่อตั้งค่า Listener บนเทมเพลต
ข้อมูลโค้ดต่อไปนี้แสดงวิธีตั้งค่า Listener ในเทมเพลต
Kotlin
PlaceListNavigationTemplate.Builder() ... .setOnContentRefreshListener { // Execute any desired logic ... // Then call invalidate() so onGetTemplate() is called again invalidate() } .build()
Java
new PlaceListNavigationTemplate.Builder() ... .setOnContentRefreshListener(() -> { // Execute any desired logic ... // Then call invalidate() so onGetTemplate() is called again invalidate(); }) .build();
ปุ่มรีเฟรชจะแสดงเฉพาะในส่วนหัวของ
PlaceListNavigationTemplate
หาก Listener มีค่า
เมื่อผู้ใช้คลิกปุ่มรีเฟรช
onContentRefreshRequested
เมธอดของ
เรียกใช้การใช้งาน OnContentRefreshListener
ภายใน
onContentRefreshRequested
โทรหา
Screen.invalidate
จากนั้นผู้จัดการประชุมจะโทรกลับไปยัง
Screen.onGetTemplate
เพื่อเรียกเทมเพลตซึ่งมีเนื้อหาที่รีเฟรชแล้ว โปรดดู
รีเฟรชเนื้อหาของเทมเพลตสำหรับ
ข้อมูลเพิ่มเติมเกี่ยวกับการรีเฟรชเทมเพลต ใช้เทมเพลตถัดไป
ส่งคืนโดย
onGetTemplate
เท่ากับ
ประเภทเดียวกัน จะนับเป็นการรีเฟรชและไม่นับรวมใน
โควต้าของเทมเพลต
ให้คำแนะนำด้วยเสียง
หากต้องการเปิดคำแนะนำการนำทางผ่านลำโพงรถยนต์ แอปของคุณต้องขอ
โฟกัสเสียง ในฐานะส่วนหนึ่งของ
AudioFocusRequest
ตั้งค่า
การใช้งานในฐานะ AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
และ
ตั้งการเพิ่มขึ้นของโฟกัสเป็น AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
จำลองการนำทาง
วิธียืนยันฟังก์ชันการไปยังส่วนต่างๆ ของแอปเมื่อคุณส่งแอปไปยัง
Google Play Store แอปของคุณต้องใช้
NavigationManagerCallback.onAutoDriveEnabled
Callback เมื่อมีการเรียก Callback นี้ แอปของคุณต้องจำลองการนำทางไปยัง
ปลายทางที่เลือกเมื่อผู้ใช้เริ่มการนำทาง แอปของคุณสามารถออกจากหน้านี้ได้
โหมดเมื่อใดก็ตามที่วงจรของ Session
ปัจจุบัน
ถึง
Lifecycle.Event.ON_DESTROY
คุณทดสอบได้ว่าระบบเรียกใช้ onAutoDriveEnabled
ของคุณโดย
กำลังเรียกใช้คำสั่งต่อไปนี้จากบรรทัดคำสั่ง
adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE
ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้
adb shell dumpsys activity service androidx.car.app.samples.navigation.car.NavigationCarAppService AUTO_DRIVE
แอปการนำทางเริ่มต้นสำหรับรถยนต์
ใน Android Auto แอปนำทางเริ่มต้นสำหรับรถยนต์จะสอดคล้องกับ แอปนำทางที่ผู้ใช้เปิด แอปเริ่มต้น ได้รับ Intent ในการไปยังส่วนต่างๆ เมื่อผู้ใช้ เรียกใช้คำสั่งการนำทางผ่าน Assistant หรือเมื่อแอปอื่นส่ง ความตั้งใจในการเริ่มต้นการนำทาง
แสดงการแจ้งเตือนการนำทางในบริบท
Alert
แสดงสิ่งที่สำคัญ
ข้อมูลแก่ผู้ขับพร้อมด้วยการดำเนินการที่ไม่บังคับ‐โดยไม่ต้องออกจากบริบท
หน้าจอการนำทาง เพื่อมอบประสบการณ์ที่ดีที่สุดให้คนขับ
Alert
ทำงานภายใน
NavigationTemplate
เพื่อหลีกเลี่ยงการบดบังเส้นทางการนำทาง และเพื่อลดสิ่งรบกวนผู้ขับขี่
Alert
พร้อมให้ใช้งานภายใน NavigationTemplate
เท่านั้น
หากต้องการแจ้งเตือนผู้ใช้นอก NavigationTemplate
ให้พิจารณาใช้การแจ้งเตือนล่วงหน้า (HUN) ตามที่อธิบายไว้ใน
แสดงการแจ้งเตือน
เช่น ใช้ Alert
เพื่อทำสิ่งต่อไปนี้
- แจ้งผู้ขับขี่เกี่ยวกับการอัปเดตที่เกี่ยวข้องกับการนำทางปัจจุบัน เช่น การเปลี่ยนแปลงในสภาพการจราจร
- ขอข้อมูลอัปเดตเกี่ยวกับการนำทางปัจจุบันให้คนขับ เช่น เครื่องตรวจจับความเร็วที่มีอยู่
- เสนองานที่ใกล้จะมาถึงและถามว่าคนขับตอบรับงานนั้นไหม เช่น คนขับจะตั้งใจรับคนระหว่างทางไหม
ในรูปแบบพื้นฐาน Alert
ประกอบด้วยชื่อและ Alert
ระยะเวลา ระยะเวลาจะแสดงด้วยแถบความคืบหน้า (ไม่บังคับ)
คุณสามารถเพิ่มคำบรรยาย ไอคอน
Action
ออบเจ็กต์
![](https://developer.android.com/training/cars/images/CarAppLib-Alert.png?authuser=9&hl=th)
เมื่อ Alert
ปรากฏขึ้น ระบบจะไม่นำไปใช้กับเทมเพลตอื่นหาก
การโต้ตอบกับไดรเวอร์จะทำให้ออกจาก NavigationTemplate
ค่าจะยังอยู่ใน NavigationTemplate
เดิมจนกว่าจะครบ Alert
ครั้ง ผู้ใช้
ดำเนินการใดไป หรือแอปจะปิด Alert
สร้างการแจ้งเตือน
ใช้ Alert.Builder
วิธีสร้างอินสแตนซ์ Alert
Kotlin
Alert.Builder( /*alertId*/ 1, /*title*/ CarText.create("Hello"), /*durationMillis*/ 5000 ) // The fields below are optional .addAction(firstAction) .addAction(secondAction) .setSubtitle(CarText.create(...)) .setIcon(CarIcon.APP_ICON) .setCallback(...) .build()
Java
new Alert.Builder( /*alertId*/ 1, /*title*/ CarText.create("Hello"), /*durationMillis*/ 5000 ) // The fields below are optional .addAction(firstAction) .addAction(secondAction) .setSubtitle(CarText.create(...)) .setIcon(CarIcon.APP_ICON) .setCallback(...) .build();
หากคุณต้องการฟัง Alert
การยกเลิกหรือการปิด ให้สร้างการดำเนินการตาม
อินเทอร์เฟซของ AlertCallback
เส้นทางการโทรของ AlertCallback
ได้แก่
หาก
Alert
หมดเวลา ผู้จัดการประชุมจะเรียกAlertCallback.onCancel
ที่มีเมธอดAlertCallback.REASON_TIMEOUT
จากนั้นจะเรียกเมธอดAlertCallback.onDismiss
หากผู้ขับคลิกปุ่มการทำงานปุ่มใดปุ่มหนึ่ง ผู้จัดจะเรียกใช้
Action.OnClickListener
จากนั้นโทรหาAlertCallback.onDismiss
หากไม่รองรับ
Alert
โฮสต์จะเป็นการโทรAlertCallback.onCancel
ด้วยAlertCallback.REASON_NOT_SUPPORTED
ผู้จัดไม่เรียกAlertCallback.onDismiss
เนื่องจากAlert
ไม่แสดง
กำหนดค่าระยะเวลาการแจ้งเตือน
เลือกระยะเวลา Alert
ตรงกับความต้องการของแอป ระยะเวลาที่แนะนำสำหรับการนำทาง
Alert
ยาว 10 วินาที ดูการแจ้งเตือนการนำทาง
เพื่อดูข้อมูลเพิ่มเติม
แสดงการแจ้งเตือน
หากต้องการแสดง Alert
ให้เรียกใช้
AppManager.showAlert
ที่มีให้ในแอป
CarContext
// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
- กำลังโทรหา
showAlert
ด้วยAlert
ที่มีalertId
รหัสเดียวกับรหัสของAlert
ที่แสดงอยู่ไม่ได้ดำเนินการใดๆAlert
ไม่อัปเดต หากต้องการอัปเดตAlert
คุณต้องสร้างใหม่ ด้วยalertId
ใหม่ - กำลังโทรหา
showAlert
ด้วยAlert
ที่มีหมายเลขอื่นalertId
มากกว่าAlert
ที่แสดงอยู่ปัจจุบันปิดAlert
กำลังแสดงอยู่
ปิดการแจ้งเตือน
ขณะที่Alert
จะปิดโดยอัตโนมัติ
เนื่องจากหมดเวลาหรือการโต้ตอบของคนขับ คุณยังสามารถปิด
Alert
เช่น ในกรณีที่ข้อมูลล้าสมัย วิธีปิด
Alert
โทรหา
dismissAlert
ที่มีเมธอด
alertId
ของAlert
// Dismiss the same alert
carContext.getCarService(AppManager.class).dismissAlert(alert.getId())
กำลังโทรหา dismissAlert
ด้วย alertId
ซึ่งไม่ตรงกับ
แสดง Alert
ไม่ดำเนินการใดๆ โดยไม่มีข้อยกเว้น