Memproses peristiwa navigasi

Aplikasi Anda dapat memproses peristiwa yang terjadi saat pengguna menavigasi di sepanjang rute.

Ringkasan

Gunakan antarmuka berikut untuk memproses peristiwa navigasi:

Melihat kode

Mendeteksi kedatangan di tujuan

Di sini, tujuan mengacu pada tujuan akhir atau titik jalan. Untuk mendeteksi kedatangan, panggil Navigator.addArrivalListener(), yang mendaftar untuk callback saat perangkat mencapai tujuan.

Setelah tiba, Navigation SDK for Android akan memicu callback onArrival(), yang kemudian dapat digunakan untuk menghentikan panduan belokan demi belokan menggunakan Navigator.stopGuidance(), atau melanjutkan ke titik jalan berikutnya menggunakan Navigator.continueToNextDestination(). Jika sesi navigasi hanya menyertakan satu tujuan, atau jika tidak ada tujuan yang tersisa dalam daftar tujuan, memanggil Navigator.continueToNextDestination() akan otomatis menghentikan panduan.

Saat Anda memanggil continueToNextDestination(), navigator akan menghapus semua informasi tentang tujuan sebelumnya. Jika ingin menganalisis informasi tentang segmen rute sebelumnya, Anda harus mengambil informasi dari navigator sebelum memanggil continueToNextDestination().

Untuk menghindari kebocoran memori, Anda harus memanggil removeArrivalListener(listener) saat tidak lagi memerlukan pemroses.

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

Menerima pembaruan lokasi

Dapatkan RoadSnappedLocationProvider dari NavigationApi, lalu panggil RoadSnappedLocationProvider.addLocationListener() untuk mendaftar callback saat lokasi atau arah perangkat berubah. Perhatikan bahwa lokasi ini ditempatkan ke jalan, sehingga mungkin berbeda dengan lokasi yang ditampilkan oleh penyedia lokasi gabungan di Location API layanan Google Play.

Navigation SDK menyediakan pembaruan lokasi sesering mungkin. Saat pembaruan lokasi tersedia, Navigation SDK akan memicu callback onLocationChanged().

Pembaruan lokasi yang disesuaikan dengan jalan tidak bergantung pada navigasi, dan dapat berlanjut bahkan setelah navigasi berhenti. Berlangganan ke pembaruan lokasi dapat menyebabkan baterai terkuras, kebocoran memori, atau pengumpulan data lokasi perangkat yang tidak disengaja jika Anda membiarkan pembaruan lokasi berjalan di latar belakang. Panggil RoadSnappedLocationProvider.removeLocationListener saat Anda tidak lagi memerlukan pemroses.

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

Menerima info terbaru tentang waktu dan jarak

Panggil Navigator.addRemainingTimeOrDistanceChangedListener() untuk mendaftar callback saat sisa waktu (detik) atau jarak (meter) berubah lebih dari nilai minimum yang ditentukan.

Jika perubahan waktu atau jarak melebihi jumlah yang ditentukan, Navigation SDK akan memicu callback onRemainingTimeOrDistanceChanged().

Untuk menemukan sisa waktu dan jarak, panggil Navigator.getTimeAndDistanceList(). Perhatikan bahwa waktu dan jarak dalam daftar bersifat kumulatif: keduanya menunjukkan waktu dan jarak dari lokasi saat ini ke setiap titik jalan, bukan dari satu titik jalan ke titik jalan lainnya. Objek TimeAndDistance juga menampilkan delaySeverity. Enum ini adalah HEAVY, MEDIUM, LIGHT, atau UNKNOWN. Hal ini sesuai dengan warna yang Anda lihat untuk PWT di UI Maps (padat = merah, sedang = kuning, lancar = hijau). Hal ini berguna jika Anda perlu membuat footer ETA sendiri.

Untuk menghindari kebocoran memori, Anda harus memanggil Navigator.removeRemainingTimeOrDistanceChangedListener(listener) saat tidak lagi memerlukan pemroses.

Contoh berikut meminta callback jika sisa waktu berubah lebih dari 60 detik atau sisa jarak berubah lebih dari 100 meter.

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

Anda dapat menampilkan informasi sisa waktu dan jarak menggunakan tampilan bawaan dengan metode setEtaCardEnabled() dan meneruskan parameter dengan nilai TRUE. Untuk menyembunyikan tampilan waktu dan jarak, tetapkan nilai ini ke FALSE.

Anda juga dapat menampilkan Perkiraan Waktu Kedatangan (ETA) untuk beberapa titik jalan menggunakan metode getTimeAndDistanceList().

Menerima info terbaru rute

Panggil Navigator.addRouteChangedListener() untuk mendaftar callback saat rute berubah.

Saat rute berubah, Navigation SDK akan memicu callback onRouteChanged(). Anda dapat memanggil Navigator.getRouteSegments dan Navigator.getCurrentRouteSegment() untuk menemukan rute baru.

Untuk menghindari kebocoran memori, Anda harus memanggil removeRouteChangedListener(listener) saat Anda tidak lagi memerlukan pemroses.

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

Mendeteksi saat mode malam berubah

Panggil NavigationView.addOnNightModeChangedListener atau NavigationFragment.addOnNightModeChangedListener untuk mendaftar callback saat mode malam berubah.

Contoh berikut menunjukkan cara memproses perubahan mode malam pada fragmen navigasi.

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

Anda juga dapat menyetel mode malam secara terprogram. Untuk mengetahui informasi selengkapnya, lihat Menyetel mode malam.