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

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

ภาพรวม

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

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

ดูโค้ด

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

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

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

เมื่อคุณเรียกใช้ 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 จะอัปเดตตำแหน่งบ่อยที่สุดเท่าที่จะเป็นไปได้ เมื่อมีการอัปเดตตำแหน่ง Navigation SDK จะเริ่มการเรียกกลับ onLocationChanged()

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

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() เพื่อลงทะเบียนสำหรับการติดต่อกลับเมื่อเวลาที่เหลือ (วินาที) หรือระยะทาง (เมตร) เปลี่ยนแปลงมากกว่าเกณฑ์ที่กำหนด

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

หากต้องการดูเวลาและระยะทางที่เหลือ ให้พูดว่า Navigator.getTimeAndDistanceList() โปรดทราบว่าเวลาและระยะทางในรายการเป็นแบบสะสม โดยจะแสดงเวลาและระยะทางจากตำแหน่งปัจจุบันไปยังจุดอ้างอิงแต่ละจุด ไม่ใช่จากจุดอ้างอิงหนึ่งไปยังอีกจุดหนึ่ง ออบเจ็กต์ TimeAndDistance ยังแสดงผล delaySeverity ด้วย enum นี้เป็น HEAVY, MEDIUM, LIGHT หรือ UNKNOWN ซึ่งสอดคล้องกับสีที่คุณเห็นสำหรับ ETA ใน UI ของ Maps (หนาแน่น = แดง, ปานกลาง = เหลือง, เบาบาง = เขียว) ซึ่งจะเป็นประโยชน์หากคุณต้องการสร้างส่วนท้าย 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

นอกจากนี้ คุณยังแสดง ETA สำหรับจุดอ้างอิงหลายจุดได้โดยใช้เมธอด 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 หรือ NavigationFragment.addOnNightModeChangedListener เพื่อลงทะเบียนรับการติดต่อกลับเมื่อโหมดกลางคืนมีการเปลี่ยนแปลง

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

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

นอกจากนี้ คุณยังตั้งค่าโหมดกลางคืนแบบเป็นโปรแกรมได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่ตั้งค่าโหมดกลางคืน