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

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

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

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

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

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

ภาพรวม

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

การใช้ฟีเจอร์ TurnByTurn

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

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

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

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

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

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

กำลังลงทะเบียนบริการสำหรับการอัปเดตการนำทาง

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

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

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

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

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

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

navigator.unregisterServiceForNavUpdates();

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

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

  • ระหว่างทาง - สถานะ 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}]

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

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

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

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

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

ไอคอนตัวอย่าง การบังคับทิศทางแบบเลี้ยวต่อเลี้ยว
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 มีให้

Navigation 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 ด้วยไอคอน

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