ฟีดข้อมูลแบบเลี้ยวต่อเลี้ยวจะให้ข้อมูลการนำทางเท่านั้นแก่อุปกรณ์ที่ไม่ได้ออกแบบมาเพื่อคำแนะนำการนำทางตามแผนที่ โดยจะมีข้อมูลการบังคับเลี้ยวที่กําลังจะเกิดขึ้นพร้อมองค์ประกอบที่คุณระบุไว้ ดังนี้
- ไอคอน (ซ้าย ขวา กลับรถ)
- หมุนหมายเลขตามวงเวียน
- ชื่อถนน
- ระยะทางและเวลาโดยประมาณไปยังขั้นตอนการนำทางถัดไปหรือ จุดหมายสุดท้าย
คุณใช้ฟีดแบบเลี้ยวต่อเลี้ยวเพื่อสร้างประสบการณ์ที่ UI การนำทางแบบเต็มไม่เหมาะสมได้ เช่น สำหรับ Android Auto หรือสำหรับหน้าจอขนาดเล็กที่ไม่มีสแต็ก Android ทั้งสแต็ก ตัวอย่างเช่น คุณอาจใช้ตัวเลือกนี้สำหรับคนขับรถสองล้อ ซึ่งสามารถแสดงคำแนะนำการนำทางเท่านั้นเพื่อช่วยให้ไปถึงจุดหมายได้เร็วขึ้นและมั่นใจยิ่งขึ้นโดยมีสิ่งรบกวนน้อยที่สุด
ในการใช้ SDK คุณจะต้องสร้างบริการและลงทะเบียนบริการกับ รหัสการนำทางสำหรับ Android เพื่อให้สามารถรับข้อมูล การนำทางใหม่แบบเรียลไทม์ (ประมาณวินาทีละครั้งระหว่างนำทาง)
เอกสารนี้แสดงวิธีสร้างและลงทะเบียนบริการนำทางที่ได้รับข้อมูลการนำทางจาก SDK และระบุสถานะการนำทางให้กับอุปกรณ์ที่เป็นผู้รับ
ภาพรวม
ส่วนนี้จะอธิบายวิธีเพิ่มคลัง TurnByTurn ลงในโปรเจ็กต์และสรุปขั้นตอนระดับสูงในการสร้างฟังก์ชันการนําทางแบบเลี้ยวต่อเลี้ยว
เพิ่มไลบรารี TurnByTurn ลงในโปรเจ็กต์โดยใช้ Maven (แนะนำ)
หากต้องการใช้ไลบรารี TurnByTurn เวอร์ชันสแตนด์อโลน ให้ทำตามขั้นตอนต่อไปนี้
- ตั้งค่าสภาพแวดล้อมเพื่อเข้าถึงที่เก็บของโฮสต์ 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() }
- เพิ่มทรัพยากร 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 นี้ หากคุณไม่มีสิทธิ์เข้าถึง โปรดติดต่อตัวแทนของคุณ
- ดาวน์โหลดและปลดซิป
google_turnbyturn_*.jar
- คัดลอกไฟล์ JAR ที่ดาวน์โหลดลงในไดเรกทอรี
app/libs
ของโปรเจ็กต์ เพิ่มรายการต่อไปนี้ลงใน
build.gradle
เพื่อรวม JAR ในบิลด์ของคุณdependencies { ... api fileTree(include: ['*.jar'], dir: 'libs') }
การใช้ไลบรารี TurnByTurn
ขั้นตอนระดับสูงในการเปิดใช้ฟังก์ชันการบอกทางแบบเลี้ยวต่อเลี้ยวมีดังนี้ ส่วนต่อๆ ไปจะให้รายละเอียดเกี่ยวกับแต่ละขั้นตอน
สร้างบริการเพื่อรับข้อมูลอัปเดตการนำทาง
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);
การเริ่มและการหยุดบริการ
บริการนำทางจะทำงานตราบใดที่
มีการเชื่อมโยงกับ SDK การนำทาง คุณสามารถเรียกใช้ startService()
และ stopService()
ด้วยตนเองเพื่อควบคุมวงจรชีวิตของบริการนำทางได้ แต่เมื่อลงทะเบียนบริการกับ Navigation SDK แล้ว บริการจะเริ่มต้นโดยอัตโนมัติและจะหยุดก็ต่อเมื่อคุณยกเลิกการลงทะเบียนเท่านั้น คุณอาจต้องลองเริ่มบริการที่ทำงานอยู่เบื้องหน้าตามที่อธิบายไว้ในภาพรวมบริการของเอกสารประกอบของ Android ทั้งนี้ขึ้นอยู่กับวิธีตั้งค่าแอป
การยกเลิกการลงทะเบียนบริการ
หากต้องการหยุดรับการอัปเดตการนำทาง ให้ยกเลิกการลงทะเบียนบริการจาก Navigation SDK
navigator.unregisterServiceForNavUpdates();
ทำความเข้าใจสถานะการนำทาง
ใช้ NavInfo.getNavState()
เพื่อดูสถานะการนําทางปัจจุบัน ซึ่งเป็นหนึ่งในสถานะต่อไปนี้
อยู่ระหว่างทาง - สถานะ
ENROUTE
หมายความว่าการนำทางแบบมีคำแนะนำทำงานอยู่และผู้ใช้อยู่ในเส้นทางที่ระบุ ข้อมูลเกี่ยวกับขั้นตอนปัจจุบันและขั้นตอนที่กำลังจะเกิดขึ้นของการเปลี่ยนเส้นทางจะแสดงอยู่กำลังเปลี่ยนเส้นทาง -
REROUTING
หมายความว่าระบบกำลังนำทางอยู่ แต่ระบบนำทางกำลังมองหาเส้นทางใหม่ ขั้นตอนการเปลี่ยนเลนข้างหน้าจะใช้งานไม่ได้เนื่องจากยังไม่มีเส้นทางใหม่ ในแอปตัวอย่าง ข้อความ "กำลังเปลี่ยนเส้นทาง..." จะปรากฏในการแสดงข้อมูลการนำทาง เมื่อพบเส้นทางแล้ว ระบบจะส่งข้อความNavInfo
พร้อมสถานะENROUTE
หยุดแล้ว -
STOPPED
หมายความว่าการนำทางสิ้นสุดแล้ว เช่น การนำทางจะหยุดเมื่อผู้ใช้ออกจากการนำทางในแอป ในแอปตัวอย่าง สถานะSTOPPED
จะล้างการแสดงข้อมูลการนำทางเพื่อป้องกันไม่ให้แสดงวิธีการแบบทีละขั้นตอนค้างไว้
ป้อนข้อมูลในการแสดงผลฟีด
เมื่อตั้งค่าบริการแบบเลี้ยวต่อเลี้ยวเรียบร้อยแล้ว ส่วนนี้จะครอบคลุมองค์ประกอบภาพและข้อความที่ใช้ป้อนข้อมูลการ์ดคำแนะนำสำหรับฟีดแบบเลี้ยวต่อเลี้ยว
ช่องข้อมูลการ์ดการนำทาง
เมื่อผู้ใช้เข้าสู่การนำทางที่มีคำแนะนำ การ์ดการนำทางจะปรากฏที่ด้านบน และมีข้อมูลการนำทางที่สร้างจาก รหัสการนำทาง รูปภาพที่เกี่ยวข้องจะแสดงตัวอย่าง องค์ประกอบการนำทางที่สำคัญเหล่านี้
ตารางนี้แสดงช่องสำหรับข้อมูลการนำทางและตำแหน่งที่จะพบ
ช่องสําหรับการนําทางแต่ละขั้นตอน | ช่องสำหรับการเดินทางโดยรวม |
---|---|
พบใน 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()
คุณต้องสร้างไอคอนของกลยุทธ์และจับคู่กับกลยุทธ์ที่เกี่ยวข้อง
สำหรับการเคลื่อนไหวบางอย่าง คุณสามารถตั้งค่าการแมปแบบ 1:1 กับไอคอนได้ เช่น DESTINATION_LEFT
และ DESTINATION_RIGHT
อย่างไรก็ตาม เนื่องจากการดำเนินการบางอย่างมีความคล้ายคลึงกัน คุณจึงอาจต้องแมปการดำเนินการมากกว่า 1 รายการกับไอคอนเดียว ตัวอย่างเช่น ทั้ง TURN_LEFT
และ ON_RAMP_LEFT
จะแมปกับไอคอนเลี้ยวซ้ายได้
การหลบเลี่ยงบางรายการจะมีป้ายกำกับ clockwise
หรือ counterclockwise
เพิ่มเติม ซึ่ง SDK จะกำหนดตามด้านที่ขับขี่ของประเทศ ตัวอย่างเช่น ในประเทศที่ขับรถทางด้านซ้ายของถนน ผู้ขับขี่จะเลี้ยวเข้าวงเวียนหรือเลี้ยวกลับทางตามเข็มนาฬิกา ส่วนประเทศที่ขับรถทางด้านขวาของถนนจะเลี้ยวตามเข็มนาฬิกา Navigation SDK จะตรวจพบว่ามีการเคลื่อนไหวในการจราจรด้านซ้ายหรือด้านขวา และแสดงผลออกมาเป็นการจัดวางที่เหมาะสม ดังนั้น ไอคอนการเคลื่อนที่อาจแตกต่างกันสำหรับการจัดวางแบบตามเข็มนาฬิกากับแบบทวนเข็มนาฬิกา
ขยายเพื่อดูตัวอย่างไอคอนสำหรับการดำเนินการต่างๆ
ไอคอนตัวอย่าง | กระบวนการ 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 รองรับการสร้างไอคอนคำแนะนำในการเลี้ยวและเลนเพื่ออำนวยความสะดวกใน 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
ขั้นตอนถัดไป
- สำหรับแอป Android Auto