Meminta pembaruan lokasi

Penggunaan informasi lokasi yang tepat akan bermanfaat bagi pengguna aplikasi Anda. Misalnya, jika aplikasi membantu pengguna menemukan jalan saat berjalan kaki atau berkendara, atau jika aplikasi melacak lokasi aset, aplikasi harus mendapatkan lokasi perangkat secara reguler. Selain lokasi geografis (lintang dan bujur), Anda mungkin ingin memberikan informasi selengkapnya kepada pengguna seperti arah (arah pergerakan horizontal), ketinggian, atau kecepatan perangkat. Informasi ini, beserta informasi lainnya, tersedia dalam objek Location yang dapat diambil oleh aplikasi Anda dari penyedia lokasi fusi. Sebagai respons, API mengupdate aplikasi Anda secara berkala dengan lokasi terbaik yang tersedia, berdasarkan penyedia lokasi yang saat ini tersedia seperti Wi-Fi dan GPS (Sistem Pemosisi Global). Keakuratan lokasi ditentukan oleh penyedia, izin akses lokasi yang Anda minta, dan opsi yang Anda tetapkan dalam permintaan lokasi.

Tutorial ini menunjukkan cara meminta pembaruan reguler tentang lokasi perangkat menggunakan metode requestLocationUpdates() di penyedia lokasi gabungan.

Mendapatkan lokasi terakhir yang diketahui

Lokasi terakhir yang diketahui dari perangkat ini menyediakan basis yang praktis untuk memulai, memastikan aplikasi memiliki lokasi yang diketahui sebelum memulai pembaruan lokasi berkala. Tutorial tentang Mendapatkan Lokasi Terakhir yang Diketahui menunjukkan cara mendapatkan lokasi terakhir yang diketahui dengan memanggil getLastLocation(). Cuplikan di bagian berikut ini menganggap aplikasi Anda sudah mengambil lokasi terakhir yang diketahui dan menyimpannya sebagai objek Location dalam variabel global mCurrentLocation.

Membuat permintaan lokasi

Sebelum meminta pembaruan lokasi, aplikasi Anda harus terhubung ke layanan lokasi dan membuat permintaan lokasi. Tutorial tentang Mengubah Setelan Lokasi menunjukkan cara melakukannya. Setelah permintaan lokasi dibuat, Anda dapat memulai pembaruan reguler dengan memanggil requestLocationUpdates().

Bergantung pada bentuk permintaan tersebut, penyedia lokasi gabungan akan memanggil metode callback LocationCallback.onLocationResult() dan meneruskan daftar objek Location padanya, atau mengeluarkan PendingIntent yang berisi lokasi dalam datanya yang diperluas. Akurasi dan frekuensi pembaruan dipengaruhi oleh izin akses lokasi yang Anda minta dan opsi yang Anda tetapkan dalam objek permintaan lokasi.

Tutorial ini menunjukkan cara mendapatkan pembaruan menggunakan pendekatan callback LocationCallback. Panggil requestLocationUpdates(), lalu teruskan instance objek LocationRequest Anda dan LocationCallback. Tentukan metode startLocationUpdates() seperti dalam contoh kode berikut:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

Perhatikan bahwa cuplikan kode di atas mengacu pada flag boolean, requestingLocationUpdates, yang digunakan untuk melacak apakah pengguna telah mengaktifkan atau menonaktifkan pembaruan lokasi. Jika pengguna telah menonaktifkan pembaruan lokasi, Anda dapat memberi tahu mereka tentang persyaratan lokasi aplikasi Anda. Untuk mengetahui informasi selengkapnya tentang mempertahankan nilai flag boolean di seluruh instance aktivitas, baca Menyimpan Status Aktivitas.

Menentukan callback pembaruan lokasi

Penyedia lokasi gabungan memanggil metode callback LocationCallback.onLocationResult(). Argumen yang masuk berisi daftar objek Location yang memuat lintang dan bujur lokasi. Cuplikan berikut menunjukkan cara mengimplementasikan antarmuka LocationCallback dan menentukan metodenya, lalu mendapatkan stempel waktu pembaruan lokasi, kemudian menampilkan lintang, bujur, dan stempel waktu pada antarmuka pengguna aplikasi Anda:

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

Menghentikan pembaruan lokasi

Pertimbangkan apakah Anda ingin menghentikan pembaruan lokasi saat aktivitas tidak lagi digunakan secara aktif, misalnya saat pengguna beralih ke aplikasi lain atau ke aktivitas yang berbeda di aplikasi yang sama. Hal ini berguna untuk mengurangi penggunaan daya selama aplikasi tidak perlu mengumpulkan informasi meskipun sedang berjalan di latar belakang. Bagian ini menunjukkan cara menghentikan pembaruan dalam metode onPause() aktivitas.

Untuk menghentikan pembaruan lokasi, panggil removeLocationUpdates() dan teruskan LocationCallback padanya, seperti dalam contoh kode berikut:

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

Gunakan boolean, requestingLocationUpdates, untuk melacak apakah pembaruan lokasi saat ini diaktifkan atau tidak. Dalam metode onResume() aktivitas, periksa apakah pembaruan lokasi saat ini sudah aktif, dan aktifkan jika belum:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

Menyimpan status aktivitas

Perubahan pada konfigurasi perangkat, seperti perubahan orientasi layar atau bahasa, dapat menyebabkan aktivitas saat ini diakhiri. Oleh karena itu, aplikasi Anda harus menyimpan informasi apa pun yang diperlukan untuk membuat ulang aktivitas. Satu cara untuk melakukannya adalah melalui status instance yang disimpan dalam objek Bundle.

Contoh kode berikut menunjukkan cara menggunakan callback onSaveInstanceState() aktivitas untuk menyimpan status instance:

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

Tentukan metode updateValuesFromBundle() untuk memulihkan nilai tersimpan dari instance aktivitas sebelumnya, jika tersedia. Panggil metode dari metode onCreate() aktivitas, seperti dalam contoh kode berikut:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

Untuk mengetahui informasi selengkapnya tentang menyimpan status instance, baca referensi class Aktivitas Android.

Catatan: Untuk penyimpanan yang lebih persisten, Anda dapat menyimpan preferensi pengguna di SharedPreferences aplikasi Anda. Tetapkan preferensi bersama dalam metode onPause() aktivitas, lalu ambil preferensi di onResume(). Untuk mengetahui informasi selengkapnya tentang menyimpan preferensi, baca Menyimpan Rangkaian Nilai Kunci.

Referensi lainnya

Untuk mempelajari lebih lanjut, manfaatkan referensi berikut:

Contoh

  • Aplikasi contoh untuk menunjukkan cara menerima pembaruan lokasi di Android.