Mengubah setelan lokasi

Jika aplikasi Anda perlu meminta lokasi atau menerima update izin, perangkat harus mengaktifkan setelan sistem yang sesuai, seperti pemindaian GPS atau Wi-Fi. Aplikasi Anda menentukan tingkat akurasi/konsumsi daya yang diperlukan serta interval update 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 Anda cara menggunakan Klien Setelan untuk memeriksa setelan mana yang aktif, dan menyajikan dialog Setelan Lokasi bagi pengguna untuk mengupdate setelannya dalam satu ketukan.

Mengonfigurasi layanan lokasi

Agar dapat menggunakan layanan lokasi yang disediakan oleh Layanan Google Play dan penyedia lokasi fusi, sambungkan aplikasi Anda menggunakan Klien Setelan, lalu periksa setelan lokasi saat ini dan minta pengguna untuk mengaktifkan setelan yang diminta bila perlu.

Aplikasi yang menggunakan layanan lokasi harus meminta izin akses lokasi. Untuk tutorial ini, deteksi lokasi sementara sudah cukup. Minta izin ini dengan elemen uses-permission di manifes aplikasi Anda, seperti yang ditampilkan dalam contoh berikut:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.google.android.gms.location.sample.locationupdates" >

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    </manifest>
    

Jika perangkat menjalankan Android 6.0 atau versi lebih tinggi, dan SDK target aplikasi Anda adalah versi 23 atau di atasnya, aplikasi tersebut harus mencantumkan izin dalam manifes dan meminta izin tersebut saat waktu proses. Untuk informasi selengkapnya, lihat Meminta Izin pada Waktu Proses.

Jika aplikasi Anda menargetkan Android 10 (API level 29) atau versi lebih tinggi dan perlu mengakses lokasi perangkat saat aplikasi berjalan di latar belakang, Anda harus mendeklarasikan izin ACCESS_BACKGROUND_LOCATION. Untuk mempelajari lebih lanjut, lihat bagian tentang cara meminta akses ke lokasi latar.

Menyiapkan permintaan lokasi

Untuk menyimpan parameter permintaan ke penyedia lokasi fusi, buat LocationRequest. Parameter ini akan menentukan tingkat akurasi permintaan lokasi. Untuk detail tentang semua opsi permintaan lokasi yang tersedia, lihat referensi class LocationRequest. Tutorial ini menetapkan interval update, interval update 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 update lokasi. Perhatikan bahwa update lokasi mungkin agak lebih cepat atau lebih lambat dari kecepatan ini guna mengoptimalkan penggunaan baterai, atau mungkin tidak ada update sama sekali (jika perangkat tidak memiliki konektivitas, misalnya).
Interval update tercepat
setFastestInterval() - Metode ini menetapkan kecepatan tercepat dalam milidetik di mana aplikasi Anda dapat menangani update lokasi. Kecuali aplikasi Anda mendapat manfaat dari penerimaan update dengan kecepatan yang lebih tinggi dari yang ditentukan dalam setInterval(), Anda tidak perlu memanggil metode ini.
Prioritas

setPriority() - Metode ini menentukan prioritas permintaan, yang memberikan petunjuk kuat tentang layanan lokasi layanan Google Play mengenai sumber lokasi yang akan digunakan. 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 mengkonsumsi daya yang lebih kecil. Dengan setelan ini, layanan lokasi cenderung menggunakan WiFi dan positioning menara seluler. Namun, perlu dicatat bahwa pilihan penyedia lokasi bergantung pada berbagai faktor lain, seperti sumber mana yang tersedia.
  • PRIORITY_HIGH_ACCURACY - Gunakan setelan ini untuk meminta lokasi setepat 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 mengkonsumsi daya yang lebih kecil.
  • PRIORITY_NO_POWER - Gunakan setelan ini jika Anda memerlukan dampak yang dapat diabaikan pada konsumsi daya namun ingin menerima update lokasi jika tersedia. Dengan setelan ini, Aplikasi Anda tidak akan memicu update lokasi apa pun, namun menerima lokasi yang dipicu oleh aplikasi lain.

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

Kotlin

    fun createLocationRequest() {
        val locationRequest = LocationRequest.create()?.apply {
            interval = 10000
            fastestInterval = 5000
            priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        }
    }
    

Java

    protected void createLocationRequest() {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(5000);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }
    

Prioritas PRIORITY_HIGH_ACCURACY yang dikombinasikan dengan setelan izin ACCESS_FINE_LOCATION yang telah Anda tetapkan dalam manifes aplikasi, dan interval update cepat sebesar 5.000 milidetik (5 detik), mengakibatkan penyedia lokasi fusi mengembalikan update lokasi yang akurat dalam ukuran beberapa kaki. Pendekatan ini sesuai untuk memetakan aplikasi yang menampilkan lokasi secara real time.

Petunjuk performa: Jika aplikasi Anda mengakses jaringan atau melakukan pekerjaan jangka panjang lainnya setelah menerima update lokasi, sesuaikan interval tercepat ke nilai yang lebih lambat. Penyesuaian ini akan mencegah aplikasi Anda untuk tidak menerima update yang tidak dapat digunakan. Setelah pekerjaan jangka panjang 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());
    

Saat 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:</a>

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 Update Lokasi, menunjukkan cara menerima update lokasi berkala.