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

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

ภาพรวม

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

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

ดูรหัส

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

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

เมื่อไปถึงจุดหมาย 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ในบริการ Google Play location APIs

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 ซึ่งสอดคล้องกับสีที่คุณเห็นในเวลาถึงโดยประมาณใน UI ของ Maps (heavy = สีแดง, medium = สีเหลือง, light = สีเขียว) ฟีเจอร์นี้มีประโยชน์หากคุณต้องการสร้างส่วนท้ายของเวลาถึงโดยประมาณด้วยตนเอง

คุณต้องเรียกใช้ 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);
    }
});

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