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 trên một tuyến đường.

Tổng quan

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

Xem mã

Phát hiện việc đến một điểm đến

Ở đây, đích đến là một đích đến cuối cùng hoặc một điểm tham chiếu. Người nhận phát hiện nơi đến, gọi Navigator.addArrivalListener(), Việc này sẽ đăng ký một lệnh gọi lại khi thiết bị đến một đích đến.

Khi đến nơi, SDK điều hướng dành cho Android sẽ kích hoạt lệnh gọi lại onArrival() và dừng hướng dẫn từng chặng. Bạn phải gọi một cách rõ ràng Navigator.continueToNextDestination() để xem tiếp đến điểm tham chiếu tiếp theo và Navigator.startGuidance() để tiếp tục điều hướng từng chặng.

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 bạn muốn phân tích về đoạn tuyến 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 rò rỉ bộ nhớ, bạn phải gọi removeArrivalListener(listener) khi không cần trình nghe lâu hơn.

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í

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

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

Thông tin cập nhật về vị trí cố định trên đường không phụ thuộc vào việc điều hướng và có thể tiếp tục ngay cả khi đã dừng điều hướng. Đăng ký nhận thông tin cập nhật vị trí có thể gây tiêu hao pin, rò rỉ bộ nhớ hoặc vô tình thu thập thông tin vị trí của thiết bị nếu bạn để thông tin cập nhật vị trí chạy trong nền. Gọi điện RoadSnappedLocationProvider.removeLocationListener khi 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 thay đổi về thời gian hoặc khoảng cách vượt quá số lượng đã chỉ định, SDK điều hướng kích hoạt onRemainingTimeOrDistanceChanged() .

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

Để tránh 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ị thông tin về thời gian và quãng đường còn lại bằng tiện ích tích hợp sẵn hiển thị bằng phương thức setEtaCardEnabled() và truyền một tham số có giá trị TRUE. Để chặn thời gian/khoảng cách màn hình, đặt giá trị này thành FALSE.

Bạn cũng có thể hiển thị ETA cho nhiều điểm tham chiếu bằng cách sử dụng Phương thức getTimeAndDistanceList().

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

Gọi Navigator.addRouteChangedListener() tới đăng ký lệnh gọi lại khi tuyến này thay đổi.

Khi tuyến đường thay đổi, SDK điều hướng 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.

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

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 khi chế độ ban đêm thay đổi

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

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

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