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

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

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

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

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

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

ภาพรวม

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

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

  1. ตั้งค่าสภาพแวดล้อมเพื่อเข้าถึงที่เก็บ Maven ของโฮสต์ โดยทำดังนี้

    Maven

    เพิ่มโค้ดต่อไปนี้ในไฟล์ pom.xml

        <project>
          ...
          <repositories>
            <repository>
              <id>google-maven-repository</id>
              <url>https://maven.google.com</url>
            </repository>
          </repositories>
          ...
        </project>
        
        

    Gradle

    เพิ่มโค้ดต่อไปนี้ในไฟล์ build.gradle

    repositories {
        ...
        google()
    }
        
  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. ดูตัวอย่างการแสดงการนำทางที่แสดงองค์ประกอบสําคัญ

สร้างบริการเพื่อรับการอัปเดตการนำทาง

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 กำหนดการหลบหลีกแต่ละครั้งที่อาจเกิดขึ้นขณะนำทาง และคุณรับการหลบหลีกสำหรับขั้นตอนหนึ่งๆ ได้จากเมธอด StepInfo.getManeuver()

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

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

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

ไอคอนตัวอย่าง TurnByTurn Maneuvers
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

เพื่ออำนวยความสะดวกต่อกรณีการใช้งานของ Android Auto การนำทาง SDK รองรับการสร้างไอคอนการนำทางและไอคอนการนำทางช่องทาง ไอคอนเหล่านี้เหมาะกับหลักเกณฑ์การปรับขนาดรูปภาพของไลบรารีแอปรถยนต์ของ 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 ด้วยไอคอน

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