Nghe sự kiện điều hướng

Ứng dụng của bạn có thể theo dõi các sự kiện xảy ra khi người dùng di chuyển dọc theo một tuyến đường.

Tổng quan

Sử dụng các giao diện sau đây để theo dõi các sự kiện điều hướng:

Xem mã

Phát hiện thời điểm đến một đích đến

Trong đó, đích đến là đích đến cuối cùng hoặc điểm tham chiếu. Để phát hiện thời điểm đến, hãy gọi Navigator.addArrivalListener(). Lệnh gọi này sẽ đăng ký một lệnh gọi lại khi thiết bị đến đích.

Khi đến nơi, Navigation SDK cho Android sẽ kích hoạt lệnh gọi lại onArrival(). Sau đó, bạn có thể dùng lệnh gọi lại này để dừng chỉ dẫn từng chặng bằng cách sử dụng Navigator.stopGuidance() hoặc chuyển sang điểm tham chiếu tiếp theo bằng cách sử dụng Navigator.continueToNextDestination(). Nếu phiên điều hướng chỉ bao gồm một đích đến duy nhất hoặc nếu không còn đích đến nào trong danh sách đích đến, thì việc gọi Navigator.continueToNextDestination() sẽ tự động dừng chỉ dẫn.

Khi bạn gọi continueToNextDestination(), trình điều hướng sẽ loại bỏ tất cả thông tin về đích đến trước đó. Nếu muốn phân tích thông tin về đoạn đường trước đó, bạn phải truy xuất thông tin từ trình điều hướng trước khi gọi continueToNextDestination().

Để tránh làm rò rỉ bộ nhớ, bạn phải gọi removeArrivalListener(listener) khi không cần trình nghe nữa.

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

Nhận thông tin cập nhật vị trí

Lấy RoadSnappedLocationProvider từ NavigationApi, sau đó gọi RoadSnappedLocationProvider.addLocationListener() để đăng ký lệnh gọi lại khi vị trí hoặc hướng của thiết bị thay đổi. Xin lưu ý rằng vị trí này được gắn vào một con đường, nên có thể khác với vị trí do trình cung cấp vị trí kết hợp trả về trong API vị trí của Dịch vụ Google Play.

Navigation SDK cung cấp thông tin cập nhật vị trí thường xuyên nhất có thể. Khi có thông tin cập nhật về vị trí, Navigation SDK sẽ kích hoạt lệnh gọi lại onLocationChanged().

Thông tin cập nhật vị trí được điều chỉnh theo đường không phụ thuộc vào chế độ chỉ đường và có thể tiếp tục ngay cả sau khi chế độ chỉ đường dừng lại. Việc đăng ký nhận thông báo cập nhật vị trí có thể khiến pin bị hao, bộ nhớ bị rò rỉ hoặc vô tình thu thập dữ liệu vị trí của thiết bị nếu bạn để thông báo cập nhật vị trí chạy ở chế độ nền. Gọi RoadSnappedLocationProvider.removeLocationListener khi bạn không cần trình nghe nữa.

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

Nhận thông tin cập nhật về thời gian và khoảng cách

Gọi Navigator.addRemainingTimeOrDistanceChangedListener() để đăng ký lệnh gọi lại khi thời gian còn lại (giây) hoặc khoảng cách (mét) thay đổi nhiều hơn một ngưỡng nhất định.

Khi mức thay đổi về thời gian hoặc khoảng cách vượt quá mức được chỉ định, Navigation SDK sẽ kích hoạt lệnh gọi lại onRemainingTimeOrDistanceChanged().

Để tìm thời gian và khoảng cách còn lại, hãy gọi Navigator.getTimeAndDistanceList(). Xin lưu ý rằng thời gian và khoảng cách trong danh sách là thông tin tích luỹ: thông tin này cho biết thời gian và khoảng cách từ vị trí hiện tại đến từng điểm tham chiếu, chứ không phải từ điểm tham chiếu này đến điểm tham chiếu khác. Đối tượng TimeAndDistance hiện cũng trả về delaySeverity. Enum này sẽ là heavy, medium, light hoặc unknown. Điều này tương ứng với màu bạn thấy trên thời gian dự kiến đến trong giao diện người dùng của Maps (nhiều = đỏ, trung bình = vàng, ít = xanh lục). Điều này sẽ hữu ích nếu bạn cần tạo chân trang eta của riêng mình.

Để tránh làm rò rỉ bộ nhớ, bạn phải gọi Navigator.removeRemainingTimeOrDistanceChangedListener(listener) khi không cần trình nghe nữa.

Mẫu bên dưới yêu cầu một lệnh gọi lại nếu thời gian còn lại thay đổi hơn 60 giây hoặc khoảng cách còn lại thay đổi hơn 100 mét.

mNavigator.addRemainingTimeOrDistanceChangedListener(60, 100,
        new Navigator.RemainingTimeOrDistanceChangedListener() {
            @Override
            public void onRemainingTimeOrDistanceChanged() {
                displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"
                        +   " has changed.",
                        DISPLAY_LOG);
            }
        });

Bạn có thể hiện thông tin về thời gian và khoảng cách còn lại bằng màn hình tích hợp thông qua phương thức setEtaCardEnabled() và truyền một tham số có giá trị TRUE. Để ẩn màn hình hiển thị thời gian và khoảng cách, hãy đặt giá trị này thành FALSE.

Bạn cũng có thể hiển thị thời gian đến dự kiến cho nhiều điểm tham chiếu bằng phương thức getTimeAndDistanceList().

Nhận thông tin cập nhật về tuyến đường

Gọi Navigator.addRouteChangedListener() để đăng ký lệnh gọi lại khi tuyến đường thay đổi.

Khi tuyến đường thay đổi, Navigation SDK sẽ kích hoạt lệnh gọi lại onRouteChanged(). Bạn có thể gọi Navigator.getRouteSegmentsNavigator.getCurrentRouteSegment() để tìm tuyến đường mới.

Để tránh làm rò rỉ bộ nhớ, bạn phải gọi removeRouteChangedListener(listener) khi không cần trình nghe nữa.

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

Phát hiện thời điểm chế độ ban đêm thay đổi

Gọi NavigationView.addOnNightModeChangedListener hoặc SupportNavigationFragment.addOnNightModeChangedListener để đăng ký một lệnh gọi lại khi chế độ ban đêm thay đổi.

Ví dụ sau đây minh hoạ việc lắng nghe các thay đổi về chế độ ban đêm trên một phân đoạn điều hướng.

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

Bạn cũng có thể đặt chế độ ban đêm theo phương thức lập trình. Để biết thêm thông tin, hãy xem bài viết Đặt chế độ ban đêm.