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

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

ภาพรวม

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

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

ดูรหัส

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

ในที่นี้ ปลายทางหมายถึงปลายทางสุดท้ายหรือจุดแวะพัก หากต้องการ ตรวจหาการมาถึง ให้โทรหา 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() เพื่อ ลงทะเบียนรับการโทรกลับเมื่อตำแหน่งหรือส่วนหัวของอุปกรณ์เปลี่ยนแปลง โปรดทราบว่า ตำแหน่งนี้จะยึดตามถนน ดังนั้นจึงอาจแตกต่างจากตำแหน่ง ที่ได้จากผู้ให้บริการตำแหน่งที่ผสานรวมใน 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 ด้วย การแจงนับนี้จะเป็น heavy, meduim, light หรือ unknown ซึ่งสอดคล้องกับสีที่คุณเห็น ในเวลาที่คาดคะเนใน 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

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

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

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

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