Mengubah setelan lokasi

Jika aplikasi Anda perlu meminta lokasi atau menerima pembaruan izin, perangkat harus mengaktifkan setelan sistem yang sesuai, seperti GPS atau pemindaian Wi-Fi. Aplikasi Anda menentukan tingkat akurasi/konsumsi daya yang diperlukan serta interval pembaruan yang diinginkan, dan perangkat akan otomatis membuat perubahan yang sesuai pada setelan sistem, bukan mengaktifkan layanan secara langsung seperti GPS perangkat. Setelan ini ditentukan oleh objek data LocationRequest.

Tutorial ini menunjukkan kepada Anda cara menggunakan Settings Client untuk memeriksa setelan yang aktif, dan menyajikan dialog Location Settings bagi pengguna untuk memperbarui setelannya dalam satu ketukan.

Mengonfigurasi layanan lokasi

Agar dapat menggunakan layanan lokasi yang disediakan oleh Layanan Google Play dan penyedia lokasi gabungan, hubungkan aplikasi Anda menggunakan Klien Setelan, lalu periksa setelan lokasi saat ini dan minta pengguna untuk mengaktifkan setelan yang diperlukan jika diperlukan.

Aplikasi yang memiliki fitur menggunakan layanan lokasi harus meminta izin akses lokasi, bergantung pada kasus penggunaan fitur tersebut.

Menyiapkan permintaan lokasi

Untuk menyimpan parameter permintaan ke penyedia lokasi gabungan, buat LocationRequest. Parameter menentukan tingkat akurasi permintaan lokasi. Untuk detail semua opsi permintaan lokasi yang tersedia, lihat referensi class LocationRequest. Tutorial ini menetapkan interval pembaruan, interval pembaruan tercepat, dan prioritas, seperti yang dijelaskan di bawah ini:

Interval update
setInterval() - Metode ini menetapkan kecepatan dalam milidetik yang menjadi pilihan aplikasi Anda dalam menerima pembaruan lokasi. Ingat bahwa pembaruan lokasi mungkin agak lebih cepat atau lebih lambat dari kecepatan ini guna mengoptimalkan penggunaan baterai, atau mungkin tidak ada pembaruan sama sekali (misalnya jika perangkat tidak memiliki konektivitas).
Interval update tercepat
setFastestInterval() - Metode ini menetapkan kecepatan tertinggi dalam milidetik yang memungkinkan aplikasi menangani pembaruan lokasi. Kecuali aplikasi Anda mendapat manfaat dari penerimaan pembaruan dengan kecepatan yang lebih tinggi dari yang ditentukan dalam setInterval(), Anda tidak perlu memanggil metode ini.
Prioritas

setPriority() - Metode ini menetapkan prioritas permintaan, yang memberikan petunjuk kuat tentang sumber lokasi yang akan digunakan bagi layanan lokasi di layanan Google Play. Nilai-nilai berikut didukung:

  • PRIORITY_BALANCED_POWER_ACCURACY - Gunakan setelan ini untuk meminta presisi lokasi dalam blok kota, dengan akurasi sekitar 100 meter. Hal ini dianggap tingkat akurasi sementara, dan cenderung mengonsumsi daya lebih sedikit. Dengan setelan ini, layanan lokasi cenderung menggunakan WiFi dan positioning menara BTS. Namun, perlu dicatat bahwa pilihan penyedia lokasi bergantung pada berbagai faktor lain, misalnya sumber yang tersedia.
  • PRIORITY_HIGH_ACCURACY - Gunakan setelan ini untuk meminta lokasi seakurat mungkin. Dengan setelan ini, layanan lokasi cenderung menggunakan GPS untuk menentukan lokasi.
  • PRIORITY_LOW_POWER - Gunakan setelan ini untuk meminta presisi tingkat kota, dengan akurasi sekitar 10 kilometer. Hal ini dianggap tingkat akurasi sementara, dan cenderung mengonsumsi daya lebih sedikit.
  • PRIORITY_NO_POWER - Gunakan setelan ini jika Anda memerlukan dampak yang dapat diabaikan pada konsumsi daya, tetapi ingin menerima pembaruan lokasi jika tersedia. Dengan setelan ini, aplikasi Anda tidak akan memicu pembaruan lokasi apa pun, tetapi menerima lokasi yang dipicu oleh aplikasi lain.

Buat permintaan lokasi dan tetapkan parameter seperti yang ditunjukkan dalam contoh kode ini:

Kotlin

fun createLocationRequest() {
  val locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

Java

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

Prioritas PRIORITY_HIGH_ACCURACY yang dikombinasikan dengan setelan izin ACCESS_FINE_LOCATION yang telah Anda tetapkan dalam manifes aplikasi, dan interval pembaruan cepat sebesar 5.000 milidetik (5 detik), akan menyebabkan penyedia lokasi gabungan menampilkan pembaruan lokasi yang akurat dalam jarak beberapa meter. Pendekatan ini sesuai untuk memetakan aplikasi yang menampilkan lokasi secara real time.

Petunjuk performa: Jika aplikasi Anda mengakses jaringan atau melakukan tugas yang berjalan lama lainnya setelah menerima pembaruan lokasi, sesuaikan interval tercepat ke nilai yang lebih lambat. Penyesuaian ini akan mencegah aplikasi menerima pembaruan yang tidak dapat digunakan. Setelah tugas yang berjalan lama selesai, setel kembali interval tercepat ke nilai cepat.

Mendapatkan setelan lokasi saat ini

Setelah tersambung ke layanan Google Play dan API layanan lokasi, Anda bisa mendapatkan setelan lokasi saat ini dari perangkat pengguna. Untuk melakukannya, buat LocationSettingsRequest.Builder, dan tambahkan satu atau beberapa permintaan lokasi. Cuplikan kode berikut menunjukkan cara menambahkan permintaan lokasi yang dibuat pada langkah sebelumnya:

Kotlin

val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(locationRequest);

Selanjutnya, periksa apakah setelan lokasi saat ini terpenuhi:

Kotlin

val builder = LocationSettingsRequest.Builder()

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

// ...

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

Setelah Task selesai, aplikasi Anda dapat memeriksa setelan lokasi dengan melihat kode status dari objek LocationSettingsResponse. Untuk mendapatkan detail selengkapnya tentang status setelan lokasi yang relevan saat ini, aplikasi Anda dapat memanggil metode getLocationSettingsStates() objek LocationSettingsResponse.

Meminta pengguna mengubah setelan lokasi

Guna menentukan apakah setelan lokasi sesuai untuk permintaan lokasi, tambahkan OnFailureListener ke objek Task yang memvalidasi setelan lokasi. Kemudian, periksa apakah objek Exception yang diteruskan ke metode onFailure() adalah instance class ResolvableApiException, yang menunjukkan bahwa setelan harus diubah. Kemudian, tampilkan dialog yang meminta izin pengguna untuk mengubah setelan lokasi dengan memanggil startResolutionForResult()

Cuplikan kode berikut menunjukkan cara menentukan apakah setelan lokasi pengguna memungkinkan layanan lokasi untuk membuat LocationRequest, serta cara meminta izin kepada pengguna untuk mengubah setelan lokasi, jika perlu:

Kotlin

task.addOnSuccessListener { locationSettingsResponse ->
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}

task.addOnFailureListener { exception ->
    if (exception is ResolvableApiException){
        // Location settings are not satisfied, but this can be fixed
        // by showing the user a dialog.
        try {
            // Show the dialog by calling startResolutionForResult(),
            // and check the result in onActivityResult().
            exception.startResolutionForResult(this@MainActivity,
                    REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
            // Ignore the error.
        }
    }
}

Java

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

Tutorial berikutnya, Menerima Pembaruan Lokasi, menunjukkan cara menerima pembaruan lokasi berkala.