ฟีดข้อมูลแบบเลี้ยวต่อเลี้ยวจะให้ข้อมูลการนำทางเท่านั้นแก่อุปกรณ์ที่ไม่ได้ออกแบบมาเพื่อคำแนะนำการนำทางตามแผนที่ ซึ่งจะให้ขั้นตอนต่อๆ ไป พร้อมด้วยองค์ประกอบที่คุณระบุ ได้แก่
- ไอคอน (ซ้าย ขวา กลับรถ)
- หมุนหมายเลขตามวงเวียน
- ชื่อถนน
- ระยะทางและเวลาโดยประมาณในการไปยังจุดหมายถัดไปหรือจุดหมายสุดท้าย
คุณใช้ฟีดแบบเลี้ยวต่อเลี้ยวเพื่อสร้างประสบการณ์ที่ UI การนำทางแบบเต็มไม่เหมาะสมได้ เช่น สำหรับ Android Auto หรือสำหรับหน้าจอขนาดเล็กที่ไม่มีสแต็ก Android ทั้งสแต็ก เช่น คุณอาจใช้ฟีเจอร์นี้สำหรับผู้ขับขี่ยานพาหนะ 2 ล้อ ซึ่งคุณสามารถฉายคำแนะนำในการนำทางเท่านั้นเพื่อช่วยให้ไปถึงจุดหมายได้เร็วขึ้นและมั่นใจมากขึ้นโดยมีการรบกวนน้อยที่สุด
ในการใช้ 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);
การเริ่มและการหยุดบริการ
บริการนำทางจะทำงานอยู่ตราบใดที่ Navigation SDK เชื่อมโยงกับบริการดังกล่าว คุณสามารถเรียกใช้ startService()
และ stopService()
ด้วยตนเองเพื่อควบคุมวงจรชีวิตของบริการนำทางได้ แต่เมื่อลงทะเบียนบริการกับ Navigation SDK แล้ว บริการจะเริ่มต้นโดยอัตโนมัติและจะหยุดก็ต่อเมื่อคุณยกเลิกการลงทะเบียนเท่านั้น คุณอาจต้องพิจารณาเริ่มบริการที่ทำงานอยู่เบื้องหน้าตามที่อธิบายไว้ในภาพรวมบริการของเอกสารประกอบ Android ทั้งนี้ขึ้นอยู่กับวิธีตั้งค่าแอป
การยกเลิกการลงทะเบียนบริการ
หากต้องการหยุดรับการอัปเดตการนำทาง ให้ยกเลิกการลงทะเบียนบริการจาก Navigation SDK
navigator.unregisterServiceForNavUpdates();
ทําความเข้าใจสถานะการนําทาง
ใช้ NavInfo.getNavState()
เพื่อดูสถานะการนําทางปัจจุบัน ซึ่งเป็นหนึ่งในสถานะต่อไปนี้
อยู่ระหว่างทาง - สถานะ
ENROUTE
หมายความว่าการนำทางแบบมีคำแนะนำทำงานอยู่และผู้ใช้อยู่ในเส้นทางที่ระบุ ข้อมูลเกี่ยวกับขั้นตอนปัจจุบันและขั้นตอนที่กำลังจะเกิดขึ้นของการเปลี่ยนเส้นทางจะแสดงอยู่กำลังเปลี่ยนเส้นทาง -
REROUTING
หมายความว่าระบบกำลังนำทางอยู่ แต่ระบบนำทางกำลังมองหาเส้นทางใหม่ ขั้นตอนการเปลี่ยนเลนข้างหน้าจะใช้งานไม่ได้เนื่องจากยังไม่มีเส้นทางใหม่ ในแอปตัวอย่าง ข้อความ "กำลังเปลี่ยนเส้นทาง..." จะปรากฏในจอแสดงข้อมูลการนำทาง เมื่อพบเส้นทาง ระบบจะส่งข้อความNavInfo
พร้อมสถานะENROUTE
หยุดแล้ว -
STOPPED
หมายความว่าการนำทางสิ้นสุดแล้ว เช่น การนำทางจะหยุดเมื่อผู้ใช้ออกจากการนำทางในแอป ในแอปตัวอย่าง สถานะSTOPPED
จะล้างการแสดงข้อมูลการนำทางเพื่อป้องกันไม่ให้แสดงวิธีการแบบทีละขั้นตอนค้างไว้
ป้อนข้อมูลในการแสดงผลฟีด
เมื่อตั้งค่าบริการบอกทางแบบเลี้ยวต่อเลี้ยวแล้ว ส่วนนี้จะกล่าวถึงองค์ประกอบภาพและข้อความที่คุณสามารถใช้เพื่อป้อนข้อมูลลงในการ์ดคำแนะนำสำหรับฟีดการบอกทางแบบเลี้ยวต่อเลี้ยว
ช่องข้อมูลการ์ดการนำทาง
เมื่อผู้ใช้เข้าสู่การนำทางแบบมีคําแนะนํา การ์ดการนําทางจะปรากฏที่ด้านบน ซึ่งมีข้อมูลการนําทางที่สร้างขึ้นจาก 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
|
ใช้ไอคอนที่สร้างขึ้น
เพื่ออำนวยความสะดวกต่อกรณีการใช้งานของ 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 ด้วยไอคอน
ขั้นตอนถัดไป
- สำหรับแอป Android Auto