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

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

ภาพรวม

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

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

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

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

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

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