ฟังเหตุการณ์การนําทาง

แอปของคุณสามารถฟังเหตุการณ์ที่เกิดขึ้นขณะที่ผู้ใช้นำทางไปตามเส้นทาง

ภาพรวม

ใช้อินเทอร์เฟซต่อไปนี้เพื่อตรวจจับเหตุการณ์การนําทาง

  • Navigator.ArrivalListener จะให้โค้ดเรียกกลับ onArrival() ซึ่งจะทริกเกอร์เมื่ออุปกรณ์มาถึงปลายทาง
  • RoadSnappedLocationProvider.LocationListener ให้โค้ดเรียกกลับ onLocationChanged() ซึ่งจะทริกเกอร์เมื่อตำแหน่งของอุปกรณ์เปลี่ยนแปลง
  • Navigator.RemainingTimeOrDistanceChangedListener แสดงการเรียกกลับ onRemainingTimeOrDistanceChanged() ซึ่งจะทริกเกอร์เมื่อเวลาหรือระยะทางไปยังปลายทางถัดไปเปลี่ยนแปลงมากกว่าจำนวนที่ระบุ
  • Navigator.RouteChangedListener แสดงการเรียกกลับ onRouteChanged() ซึ่งจะทริกเกอร์เมื่อเปลี่ยนเส้นทาง

ดูรหัส

ตรวจหาการมาถึงจุดหมาย

ในที่นี้ ปลายทางจะหมายถึงปลายทางสุดท้ายหรือจุดอ้างอิง หากต้องการตรวจจับการมาถึง ให้โทรหา Navigator.addArrivalListener() ซึ่งจะลงทะเบียนการติดต่อกลับเมื่ออุปกรณ์ถึงจุดหมาย

เมื่อมาถึงแล้ว Navigation SDK สำหรับ Android จะเริ่มเรียกใช้โค้ดเรียกกลับ onArrival() และหยุดคำแนะนำแบบเลี้ยวต่อเลี้ยว คุณต้องเรียก Navigator.continueToNextDestination() อย่างชัดแจ้งเพื่อไปยังจุดอ้างอิงถัดไป และ Navigator.startGuidance() เพื่อนำทางแบบเลี้ยวต่อเลี้ยวต่อไป

เมื่อคุณโทรหา continueToNextDestination() เครื่องมือนำทางจะทิ้งข้อมูลทั้งหมดเกี่ยวกับจุดหมายก่อนหน้า หากต้องการวิเคราะห์ข้อมูลเกี่ยวกับส่วนของเส้นทางก่อนหน้า คุณต้องดึงข้อมูลจากตัวนำทางก่อนเรียกใช้ continueToNextDestination()

คุณต้องเรียกใช้ removeArrivalListener(listener) เมื่อไม่จำเป็นต้องใช้ Listener อีกต่อไปเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ

mNavigator.addArrivalListener(new Navigator.ArrivalListener() {
    @Override
    public void onArrival(ArrivalEvent arrivalEvent) {
        displayMessage("onArrival: You've arrived at a waypoint: "
                + mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_BOTH);
        // Start turn-by-turn guidance for the next leg of the route.
        if (arrivalEvent.isFinalDestination()) {
            displayMessage("onArrival: You've arrived at the final destination.",
                    DISPLAY_BOTH);
        } else {
            mNavigator.continueToNextDestination();
            mNavigator.startGuidance();
        }
    }
});

รับการอัปเดตตำแหน่ง

รับ RoadSnappedLocationProvider จาก NavigationApi จากนั้นโทรหา RoadSnappedLocationProvider.addLocationListener() เพื่อลงทะเบียนสำหรับการติดต่อกลับเมื่อตำแหน่งหรือส่วนหัวมีการเปลี่ยนแปลง โปรดทราบว่าตำแหน่งนี้จะเชื่อมต่อกับถนน และอาจแตกต่างจากตำแหน่งที่ผู้ให้บริการ Fused Location ส่งคืนใน API ตำแหน่งของบริการ Google Play

Navigation SDK ให้บริการอัปเดตตำแหน่งบ่อยเท่าที่ทำได้ เมื่ออัปเดตตำแหน่งพร้อมใช้งาน SDK การนำทางจะเริ่มโค้ดเรียกกลับ onLocationChanged()

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

mRoadSnappedLocationProvider =
        NavigationApi.getRoadSnappedLocationProvider(getApplication());
if (mRoadSnappedLocationProvider != null) {
    mRoadSnappedLocationProvider.addLocationListener(
            new RoadSnappedLocationProvider.LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    displayMessage("onLocationUpdated: Navigation engine has provided a new"
                                    + " road-snapped location: "
                                    + location.toString(),
                            DISPLAY_LOG);
                }
            });
} else {
    displayMessage("ERROR: Failed to get a location provider", DISPLAY_LOG);
}

รับข้อมูลอัปเดตเกี่ยวกับเวลาและระยะทาง

โทร Navigator.addRemainingTimeOrDistanceChangedListener() เพื่อลงทะเบียนสำหรับการติดต่อกลับเมื่อเวลา (วินาที) หรือระยะทางที่เหลืออยู่ (เมตร) เปลี่ยนแปลงมากกว่าเกณฑ์ที่ระบุ

เมื่อการเปลี่ยนแปลงเวลาหรือระยะทางเกินจำนวนที่ระบุ SDK การนำทางจะเริ่มการเรียกกลับ onRemainingTimeOrDistanceChanged()

หากต้องการดูเวลาและระยะทางที่เหลือ โปรดโทรไปที่ Navigator.getTimeAndDistanceList() โปรดทราบว่าเวลาและระยะทางในรายการเป็นข้อมูลแบบสะสม โดยแสดงเวลาและระยะทางจากตำแหน่งปัจจุบันไปยังจุดอ้างอิงแต่ละจุด ไม่ใช่จากจุดอ้างอิงหนึ่งไปยังอีกจุดหนึ่ง ตอนนี้ออบเจ็กต์ TimeAndDistance จะแสดงผล delaySeverity ด้วย enum นี้จะหนัก เมดูอิม เบา หรือไม่ทราบ ซึ่งจะสอดคล้องกับสีที่คุณเห็นบน UI ของแผนที่ (สีจำนวนมาก = สีแดง, ปานกลาง = สีเหลือง, สีอ่อน = สีเขียว) ซึ่งจะเป็นประโยชน์หากคุณต้องการสร้างส่วนท้ายของ ETA ขึ้นมาเอง

คุณต้องเรียกใช้ Navigator.removeRemainingTimeOrDistanceChangedListener(listener) เมื่อไม่จำเป็นต้องใช้ Listener อีกต่อไปเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ

ตัวอย่างด้านล่างจะขอให้เรียกกลับหากเวลาที่เหลือเปลี่ยนแปลงมากกว่า 60 วินาที หรือระยะทางที่เหลือเปลี่ยนไปมากกว่า 100 เมตร

mNavigator.addRemainingTimeOrDistanceChangedListener(60, 100,
        new Navigator.RemainingTimeOrDistanceChangedListener() {
            @Override
            public void onRemainingTimeOrDistanceChanged() {
                displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"
                        + " has changed.",
                        DISPLAY_LOG);
            }
        });

คุณแสดงข้อมูลเวลาและระยะทางที่เหลืออยู่ได้โดยใช้จอแสดงผลในตัวโดยใช้เมธอด setEtaCardEnabled() และส่งพารามิเตอร์ที่มีค่า TRUE หากต้องการระงับการแสดงเวลา/ระยะทาง ให้กำหนดค่านี้เป็น FALSE

คุณแสดงเวลาถึงโดยประมาณสำหรับจุดอ้างอิงหลายจุดได้โดยใช้เมธอด getTimeAndDistanceList()

รับข้อมูลอัปเดตเส้นทาง

โทร Navigator.addRouteChangedListener() เพื่อลงทะเบียนสำหรับการติดต่อกลับเมื่อเส้นทางเปลี่ยนแปลง

เมื่อเปลี่ยนเส้นทางแล้ว Navigation SDK จะเริ่มเรียกใช้โค้ดเรียกกลับ onRouteChanged() คุณสามารถโทรหา Navigator.getRouteSegments และ Navigator.getCurrentRouteSegment() เพื่อหาเส้นทางใหม่

คุณต้องเรียกใช้ removeRouteChangedListener(listener) เมื่อไม่จำเป็นต้องใช้ Listener อีกต่อไปเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ

mNavigator.addRouteChangedListener(new Navigator.RouteChangedListener() {
    @Override
    public void onRouteChanged() {
        displayMessage("onRouteChanged: The driver's route has changed. Current waypoint: "
                + mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_LOG);
    }
});

ตรวจจับเมื่อเปลี่ยนโหมดกลางคืน

โทร NavigationView.addOnNightModeChangedListener หรือ SupportNavigationFragment.addOnNightModeChangedListener เพื่อลงทะเบียนสำหรับการติดต่อกลับเมื่อเปลี่ยนโหมดกลางคืน

ตัวอย่างต่อไปนี้แสดงการฟังการเปลี่ยนแปลงโหมดกลางคืนใน Fragment การนำทาง

mNavFragment.addOnNightModeChangedListener(new NavigationView.OnNightModeChangedListener() {
    @Override
    public void onNightModeChanged(NightModeChangedEvent nightModeChangedEvent) {
        displayMessage("Night mode is active: " + nightModeChangedEvent.inNightMode(),
        DISPLAY_LOG);
    }
});