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

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

ภาพรวม

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

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

ดูรหัส

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

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

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

เมื่อคุณเรียกใช้ continueToNextDestination() โปรแกรมนำทางจะทิ้งข้อมูลทั้งหมดเกี่ยวกับปลายทางก่อนหน้า หากต้องการวิเคราะห์ข้อมูลเกี่ยวกับส่วนของเส้นทางก่อนหน้า คุณต้องเรียกข้อมูลมาจากโปรแกรมนำทางก่อนเรียก continueToNextDestination()

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

คุณต้องเรียกใช้ Navigator.removeRemainingTimeOrDistanceChangedListener(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) เมื่อไม่ต้องการตัวฟังอีกต่อไปเพื่อหลีกเลี่ยงปัญหาหน่วยความจำรั่ว

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);
    }
});

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