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

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

ภาพรวม

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

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

ดูโค้ด

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

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

เมื่อมาถึงแล้ว Navigation SDK สำหรับ Android จะเริ่มการทำงานของ Callback 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 การนำทางจะเริ่มการทำงานของ Callback 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 การนำทางจะเริ่มการทำงานของ Callback onRemainingTimeOrDistanceChanged()

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

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

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

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