สร้างแอปการนำทาง

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

ประกาศการรองรับการนำทางในไฟล์ 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 เพื่อกำหนดข้อความและไอคอนไว้ข้างหรือแทนที่เวลาโดยประมาณ ของการถึง เวลาที่เหลือ และระยะทางที่เหลือ

วันที่
รูปที่ 1 เวลาเดินทางโดยประมาณพร้อมไอคอนและข้อความที่กำหนดเอง

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

  1. ทำเครื่องหมายการแจ้งเตือนว่าดำเนินอยู่ด้วย NotificationCompat.Builder.setOngoing
  2. ตั้งหมวดหมู่ของการแจ้งเตือนเป็นNotification.CATEGORY_NAVIGATION
  3. ขยายการแจ้งเตือนด้วย 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 แสดงสิ่งที่สำคัญ ข้อมูลแก่ผู้ขับพร้อมด้วยการดำเนินการที่ไม่บังคับ&dash;โดยไม่ต้องออกจากบริบท หน้าจอการนำทาง เพื่อมอบประสบการณ์ที่ดีที่สุดให้คนขับ Alert ทำงานภายใน NavigationTemplate เพื่อหลีกเลี่ยงการบดบังเส้นทางการนำทาง และเพื่อลดสิ่งรบกวนผู้ขับขี่

Alert พร้อมให้ใช้งานภายใน NavigationTemplate เท่านั้น หากต้องการแจ้งเตือนผู้ใช้นอก NavigationTemplate ให้พิจารณาใช้การแจ้งเตือนล่วงหน้า (HUN) ตามที่อธิบายไว้ใน แสดงการแจ้งเตือน

เช่น ใช้ Alert เพื่อทำสิ่งต่อไปนี้

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

ในรูปแบบพื้นฐาน Alert ประกอบด้วยชื่อและ Alert ระยะเวลา ระยะเวลาจะแสดงด้วยแถบความคืบหน้า (ไม่บังคับ) คุณสามารถเพิ่มคำบรรยาย ไอคอน Action ออบเจ็กต์

วันที่
รูปที่ 2 การแจ้งเตือนการนำทางในบริบท

เมื่อ 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 ไม่ดำเนินการใดๆ โดยไม่มีข้อยกเว้น