เปิดใช้ฟีดข้อมูลแบบเลี้ยวต่อเลี้ยว

ฟีดข้อมูลแบบเลี้ยวต่อเลี้ยวจะให้ข้อมูลการนำทางเท่านั้นแก่อุปกรณ์ที่ไม่ได้ออกแบบมาสำหรับคำแนะนำการนำทางตามแผนที่ โดยมีองค์ประกอบที่ จัดเตรียมไว้ให้ในเร็วๆ นี้

  • ไอคอน (ซ้าย ขวา กลับรถ)
  • เปิดเลขในวงเวียน
  • ชื่อถนน
  • ระยะทางและเวลาโดยประมาณไปยังขั้นตอนการนำทางถัดไปหรือ จุดหมายสุดท้าย

คุณสามารถใช้ฟีดแบบเลี้ยวต่อเลี้ยวเพื่อสร้างประสบการณ์ที่ UI การนำทาง SDK แบบเต็มไม่เหมาะสม เช่น สำหรับ Android Auto หรือสำหรับหน้าจอขนาดเล็กที่ Android สแต็กเต็มรูปแบบไม่พร้อมใช้งาน ตัวอย่างเช่น คุณอาจใช้วิธีนี้สำหรับผู้ขับขี่ยานพาหนะ 2 ล้อ ซึ่งสามารถฉายภาพคำแนะนำการนำทางเท่านั้น เพื่อช่วยให้พวกเขาไปถึงจุดหมายได้เร็วขึ้นและมั่นใจมากขึ้นโดยมีสิ่งรบกวนน้อยที่สุด

ในการใช้ SDK คุณจะต้องสร้างบริการและลงทะเบียนบริการกับ Navigation SDK สำหรับ Android เพื่อให้ได้รับข้อมูลการนำทางใหม่ในแบบเรียลไทม์ (ประมาณ 1 วินาทีระหว่างการนำทาง)

เอกสารนี้แสดงวิธีสร้างและลงทะเบียนบริการการนำทางที่รับข้อมูลการนำทางจาก SDK และระบุสถานะการนำทางไปยังอุปกรณ์ที่รับ

ภาพรวม

ส่วนนี้จะอธิบายวิธีเพิ่มไลบรารี TurnByTurn ลงในโปรเจ็กต์ของคุณและสรุปโฟลว์ระดับสูงสำหรับการสร้างฟังก์ชันแบบเลี้ยวต่อเลี้ยว

หากต้องการใช้ไลบรารี TurnByTurn เวอร์ชันสแตนด์อโลน ให้ทำตามขั้นตอนต่อไปนี้

  1. ตั้งค่าสภาพแวดล้อมเพื่อเข้าถึงที่เก็บ Maven ของโฮสต์ตามที่อธิบายไว้ในการเริ่มต้นใช้งาน SDK ไดรเวอร์ในเอกสารประกอบเกี่ยวกับการเดินทางและการสั่งซื้อ

  2. เพิ่มทรัพยากร Dependency ต่อไปนี้ในการกำหนดค่า Maven หรือ Gradle

    Maven

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.maps</groupId>
        <artifactId>google_turnbyturn</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
    

    Gradle

    dependencies {
      ...
      implementation 'com.google.android.maps:google_turnbyturn:1.0.0'
    }
    

เพิ่มไลบรารี TurnByTurn ลงในโปรเจ็กต์ของคุณโดยใช้ไฟล์ JAR ที่ดาวน์โหลดมา (ทางเลือก)

ไลบรารี TurnByTurn เป็นไฟล์ JAR ในโฟลเดอร์ SDK นี้ หากไม่มีสิทธิ์เข้าถึง โปรดติดต่อตัวแทน

  1. ดาวน์โหลดและปลดซิป google_turnbyturn_*.jar
  2. คัดลอกไฟล์ JAR ที่ดาวน์โหลดไว้ในไดเรกทอรี app/libs ของโปรเจ็กต์
  3. เพิ่มโค้ดต่อไปนี้ลงใน build.gradle เพื่อรวม JAR ในบิลด์

    dependencies {
       ...
       api fileTree(include: ['*.jar'], dir: 'libs')
    }
    

การใช้ไลบรารี TurnByTurn

ต่อไปนี้เป็นขั้นตอนระดับสูงสำหรับการเปิดใช้ฟังก์ชันแบบเลี้ยวต่อเลี้ยว เนื้อหาต่อไปนี้จะแสดงรายละเอียดเกี่ยวกับแต่ละขั้นตอน

  1. สร้างบริการเพื่อรับข้อมูลอัปเดตเกี่ยวกับการไปยังส่วนต่างๆ

  2. ลงทะเบียนบริการ

  3. ทําความเข้าใจสถานะการนําทาง

  4. ดูตัวอย่างการแสดงผลการนำทางซึ่งแสดงองค์ประกอบที่จำเป็น

สร้างบริการเพื่อรับข้อมูลอัปเดตเกี่ยวกับการไปยังส่วนต่างๆ {#service}

Navigation SDK จะเชื่อมโยงกับบริการ TurnByTurn ของคุณและส่งการอัปเดตการนำทางผ่าน Android Messenger โดยคุณจะสร้างบริการนำทางใหม่สำหรับการอัปเดตเหล่านี้ หรือจะใช้บริการที่มีอยู่ก็ได้

ประโยชน์ของการใช้บริการเพื่อรับอัปเดตการนำทางคือ บริการดังกล่าวอาจอยู่ในกระบวนการเบื้องหลังที่แยกต่างหาก

บริการในตัวอย่างต่อไปนี้จะรับข้อมูลการนำทาง และใช้ TurnByTurnManager เพื่อแปลงข้อมูลเป็นออบเจ็กต์ NavInfo ที่มีรายละเอียดการนำทาง

/**
 *   Receives turn-by-turn navigation information forwarded from NavSDK.
 */
public class NavInfoReceivingService extends Service {
  /** The messenger used by the service to receive nav step updates. */
  private Messenger incomingMessenger;
  private TurnByTurnManager turnByTurnManager;

  private final class IncomingNavStepHandler extends Handler {
    public IncomingNavStepHandler(Looper looper) {
      super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
      // Identify the message through the msg.what field.
      if (TurnByTurnManager.MSG_NAV_INFO == msg.what) {
        // Extract the NavInfo object using the TurnByTurnManager.
        NavInfo navInfo = turnByTurnManager
          .readNavInfoFromBundle(msg.getData()));
      // Do something with the NavInfo
    }
  }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
  return incomingMessenger.getBinder();
}

@Override
public void onCreate() {
  turnByTurnManager = TurnByTurnManager.createInstance();
  HandlerThread thread =
    new HandlerThread("NavInfoReceivingService",
      Process.THREAD_PRIORITY_DEFAULT);
  thread.start();
  incomingMessenger = new Messenger(
    new IncomingNavStepHandler(thread.getLooper()));
}

รหัสข้อความ

ระบบจะระบุข้อความ NavInfo ได้ผ่านช่อง Message.what ของคลาส Message ซึ่งตั้งค่าเป็น TurnByTurnManager.MSG_NAV_INFO

กำลังลงทะเบียนบริการเพื่อรับการอัปเดตการนำทาง {#register}

ข้อมูลโค้ดต่อไปนี้จะบันทึกบริการการนำทาง

boolean isNavInfoReceivingServiceRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(), NavInfoReceivingService.class.getName(), numNextStepsToPreview);

การเริ่มและการหยุดบริการ

บริการการนำทางทำงานอยู่ตราบใดที่ SDK การนำทางเชื่อมโยงกับบริการนั้น คุณเรียกใช้ startService() และ stopService() ด้วยตนเองเพื่อควบคุมวงจรการใช้งานบริการการนำทางได้ แต่เมื่อคุณลงทะเบียนบริการกับ Navigation SDK บริการจะเริ่มต้นโดยอัตโนมัติ และจะหยุดลงเมื่อคุณยกเลิกการลงทะเบียนเท่านั้น คุณอาจต้องการพิจารณาเริ่มต้นบริการที่ทำงานอยู่เบื้องหน้าตามที่อธิบายไว้ในภาพรวมของบริการในเอกสารประกอบสำหรับ Android ทั้งนี้ขึ้นอยู่กับวิธีตั้งค่าแอป

กำลังยกเลิกการลงทะเบียนบริการ

หากต้องการหยุดอัปเดตการนำทาง ให้ยกเลิกการลงทะเบียนบริการจาก Navigation SDK

navigator.unregisterServiceForNavUpdates();

ทําความเข้าใจสถานะการนําทาง {#states}

ใช้ NavInfo.getNavState() เพื่อรับสถานะปัจจุบันของการนำทาง ซึ่งมีดังนี้

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

  • กำลังเปลี่ยนเส้นทาง - REROUTING หมายความว่าการนำทางอยู่ระหว่างดำเนินการ แต่การนำทางกำลังมองหาเส้นทางใหม่ ขั้นตอนการบังคับทิศทางที่กำลังจะมาถึงไม่พร้อมใช้งาน เพราะยังไม่มีเส้นทางใหม่ ในตัวอย่างแอป ข้อความ "กำลังเปลี่ยนเส้นทาง..." จะปรากฏในการแสดงข้อมูลการนำทาง เมื่อพบเส้นทางแล้ว ระบบจะส่งข้อความ NavInfo ด้วยสถานะ ENROUTE

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

ป้อนข้อมูลที่แสดงฟีด

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

หน้าจออุปกรณ์เคลื่อนที่แสดงทางเลี้ยวซ้ายที่กำลังจะมาถึงในอีก 100 ฟุตเข้าสู่ถนน W Ahwanee Ave ที่ด้านล่างของหน้าจอ เวลาที่จะไปถึงจุดหมายคือ 46 นาที และระยะทางที่เหลือคือ 39 ไมล์

เมื่อคนขับเข้าสู่การนำทางพร้อมคำแนะนำ การ์ดการนำทางจะปรากฏที่ด้านบน ซึ่งมีวันที่การนำทางซึ่งป้อนข้อมูลจาก Navigation SDK รูปภาพที่เกี่ยวข้องแสดงตัวอย่างองค์ประกอบการนำทางที่สำคัญเหล่านี้

ตารางนี้แสดงช่องสำหรับข้อมูลการนำทางและตําแหน่งที่คุณพบ

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

คำแนะนำช่องทาง

Navigation SDK แสดงช่องทางในการ์ดเลี้ยวการนำทางเป็นออบเจ็กต์ข้อมูล Lane และ LaneDirection วัตถุ Lane แสดงช่องทางที่เฉพาะเจาะจงระหว่างการนำทางและมีรายการวัตถุ LaneDirection รายการที่อธิบายถึงการเลี้ยวทั้งหมดที่ทำได้จากช่องทางนี้

ตัวอย่างการกำหนดค่าคำแนะนำช่องทาง

เส้นทางที่แนะนำที่ผู้ขับควรใช้ในเลนจะมีเครื่องหมายผ่านช่อง isRecommended

ตัวอย่างคำแนะนำช่องทาง

ตัวอย่างต่อไปนี้แสดงการนำเสนอข้อมูลของช่องทางที่แสดงอยู่ด้านบน

// Lane 1
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false},
                  {/*laneShape=*/ SLIGHT_LEFT, /*isRecommended=*/ true}]

// Lane 2
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false}]

สร้างไอคอนสำหรับการบังคับทิศทาง

enum ของ Maneuver จะระบุการบังคับทิศทางที่เป็นไปได้แต่ละรายการที่อาจเกิดขึ้นขณะนำทาง และคุณสามารถรับการนำทางสำหรับขั้นตอนที่ระบุได้จากเมธอด StepInfo.getManeuver()

คุณต้องสร้างไอคอนบังคับและจับคู่กับเครื่องมือที่เกี่ยวข้อง ในบางวิธี คุณยังตั้งค่าการจับคู่แบบหนึ่งต่อหนึ่งกับไอคอนได้ เช่น DESTINATION_LEFT และ DESTINATION_RIGHT แต่เนื่องจากมีการใช้วิธีการบางอย่างที่คล้ายกัน คุณอาจต้องแมปการนำทางมากกว่า 1 รายการกับไอคอนเดียว ตัวอย่างเช่น TURN_LEFT และ ON_RAMP_LEFT สามารถจับคู่กับไอคอนเลี้ยวซ้ายได้

การวางแผนบางรายการมีป้ายกำกับ clockwise หรือ counterclockwise เพิ่มเติมซึ่ง SDK กำหนดโดยอิงตามด้านการขับรถของประเทศ ตัวอย่างเช่น ในประเทศที่การขับรถอยู่บนด้านซ้ายของถนน ผู้ขับจะวนเวียนหรือกลับรถในทิศทางตามเข็มนาฬิกา ขณะที่ประเทศที่อยู่ด้านขวาสุดถนนจะวิ่งตามเข็มนาฬิกา Navigation SDK จะตรวจจับว่าการขับขี่เกิดขึ้นในการรับส่งข้อมูลด้านซ้ายหรือด้านขวา และเอาต์พุตที่เหมาะสม ดังนั้น ไอคอนเคลื่อนที่จึงอาจแตกต่างกัน ในการเคลื่อนไหว 1 ทวนและทวนเข็มนาฬิกา

ขยายเพื่อดูตัวอย่างไอคอนสำหรับการบังคับแบบต่างๆ

ไอคอนตัวอย่าง การขับขี่แบบ TurnByTurn
DEPART
UNKNOWN
STRAIGHT
ON_RAMP_UNSPECIFIED
OFF_RAMP_UNSPECIFIED
NAME_CHANGE
TURN_RIGHT
ON_RAMP_RIGHT
TURN_LEFT
ON_RAMP_LEFT
TURN_SLIGHT_RIGHT
ON_RAMP_SLIGHT_RIGHT
OFF_RAMP_SLIGHT_RIGHT
TURN_SLIGHT_LEFT
ON_RAMP_SLIGHT_LEFT
OFF_RAMP_SLIGHT_LEFT
TURN_SHARP_RIGHT
ON_RAMP_SHARP_RIGHT
OFF_RAMP_SHARP_RIGHT
TURN_SHARP_LEFT
ON_RAMP_SHARP_LEFT
OFF_RAMP_SHARP_LEFT
TURN_U_TURN_COUNTERCLOCKWISE
ON_RAMP_U_TURN_COUNTERCLOCKWISE
OFF_RAMP_U_TURN_COUNTERCLOCKWISE
TURN_U_TURN_CLOCKWISE
ON_RAMP_U_TURN_CLOCKWISE
OFF_RAMP_U_TURN_CLOCKWISE
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_RIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
ROUNDABOUT_STRAIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_LEFT_CLOCKWISE
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
ROUNDABOUT_U_TURN_CLOCKWISE
ROUNDABOUT_COUNTERCLOCKWISE
ROUNDABOUT_CLOCKWISE
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
ROUNDABOUT_EXIT_CLOCKWISE
MERGE_RIGHT
OFF_RAMP_RIGHT
MERGE_LEFT
OFF_RAMP_LEFT
FORK_RIGHT
TURN_KEEP_RIGHT
ON_RAMP_KEEP_RIGHT
OFF_RAMP_KEEP_RIGHT
FORK_LEFT
TURN_KEEP_LEFT
ON_RAMP_KEEP_LEFT
OFF_RAMP_KEEP_LEFT
MERGE_UNSPECIFIED
DESTINATION
DESTINATION_RIGHT
DESTINATION_LEFT
FERRY_BOAT
FERRY_TRAIN

ใช้ไอคอนที่สร้างขึ้น

รายการไอคอนเล็กๆ ที่สร้างขึ้นจาก Navigation SDK

SDK การนำทางรองรับการสร้างไอคอนแนะนำเส้นทางและไอคอนแนะนำช่องทาง เพื่ออำนวยความสะดวกใน Use Case ของ Android Auto ไอคอนเหล่านี้ตรงตามคำแนะนำด้านขนาดภาพของไลบรารีแอป Android Auto ในรถยนต์ที่แนะนำการกําหนดเป้าหมายเป็นกรอบล้อมรอบขนาด 500 x 74 dp ดูรายละเอียดได้ที่ setsLaneImage และ CarIcon ในเอกสารอ้างอิงของ Android

ตัวอย่างการสร้างไอคอน

NavigationUpdatesOptions options =
  NavigationUpdatesOptions.builder()
             .setNumNextStepsToPreview(numNextStepsToPreview)
             .setGeneratedStepImagesType(GeneratedStepImagesType.BITMAP)
             .setDisplayMetrics(getResources().getDisplayMetrics())
             .build();
boolean isRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(),
              NavInfoReceivingService.class.getName(),
              options);

หลังจากเปิดใช้การสร้างไอคอน ออบเจ็กต์ TurnbyTurn StepInfo จะสร้างช่อง maneuverBitmap และ lanesBitmap พร้อมไอคอน

ขั้นตอนถัดไป