Panduan Pengembang Android untuk API Layanan Lokasi Google

Diterbitkan: 2022-03-11

Mengetahui lokasi pengguna Anda adalah informasi yang berguna dalam banyak aplikasi yang kami kembangkan dan gunakan saat ini. Ada banyak aplikasi berbasis lokasi populer di luar sana yang membuat hidup kita lebih mudah, serta mengubah cara kita menggunakan layanan ini. Contohnya adalah aplikasi Foursquare yang sangat populer, di mana pengguna yang sering ke tempat usaha dan "check-in" sering kali memenangkan diskon. Uber, yang membantu Anda mendapatkan tumpangan dari ponsel Anda dengan tarif lebih rendah daripada taksi biasa. Daftarnya besar dan masih terus bertambah.

API layanan lokasi

Pada artikel ini, kita akan membangun aplikasi Android sederhana untuk menentukan garis lintang dan garis bujur pengguna menggunakan API Layanan Lokasi Google Android. Saat mengembangkan aplikasi Android, ada beberapa cara untuk mendapatkan lokasi pengguna.

Paket "android.location"

Paket “android.location” telah tersedia sejak Android pertama kali diperkenalkan, dan memberikan kita akses ke layanan lokasi. Layanan ini memungkinkan aplikasi untuk mendapatkan pembaruan berkala dari lokasi geografis perangkat.

Paket ini menyediakan dua cara untuk memperoleh data lokasi:

  • LocationManager.GPS_PROVIDER: Menentukan lokasi menggunakan satelit. Tergantung pada kondisinya, penyedia ini mungkin memerlukan beberapa saat untuk mengembalikan perbaikan lokasi.

  • LocationManager.NETWORK_PROVIDER: Menentukan lokasi berdasarkan ketersediaan menara seluler dan titik akses WiFi terdekat. Ini lebih cepat dari GPS_PROVIDER.

Saat Anda mencari lokasi pengguna, Anda harus bermain dengan penyedia ini dan ketersediaannya. Idealnya Anda mendapatkan lokasi pertama menggunakan NETWORK_PROVIDER, yang mungkin tidak seakurat itu, tetapi jauh lebih cepat. Anda kemudian dapat mencoba meningkatkan akurasi dengan mendengarkan perbaikan lokasi yang lebih baik menggunakan GPS_PROVIDER.

API yang disediakan oleh paket ini cukup rendah, dan mengharuskan pengembang aplikasi untuk menangani detail yang lebih baik dalam menentukan kapan harus meminta data lokasi dan menjadwalkan panggilan ke API dengan cara yang dioptimalkan. Untuk meningkatkan pengalaman pengembang dengan layanan sistem berbasis lokasi dan memudahkan proses pengembangan aplikasi yang sadar lokasi, Google memperkenalkan cara baru untuk meminta lokasi pengguna menggunakan Layanan Google Play. Ini menawarkan API yang lebih sederhana dengan akurasi yang lebih tinggi, geofencing berdaya rendah, dan banyak lagi.

API Layanan Lokasi Google

API Layanan Lokasi Google, juga dikenal sebagai FusedLocationProviderApi, adalah cara yang direkomendasikan Google untuk mendapatkan lokasi pengguna. Ini memberikan akurasi terbaik berdasarkan kebutuhan kita. Beberapa keuntungan menggunakan API ini dibandingkan yang sebelumnya adalah:

  • Kesederhanaan: Tidak seperti API sebelumnya, Anda tidak lagi harus berurusan dengan banyak penyedia. Sebagai gantinya, Anda menentukan kebutuhan tingkat tinggi, seperti "akurasi tinggi" atau "daya rendah", dan itu akan mengambil pendekatan yang sesuai.

  • Ketersediaan: Memberi aplikasi Anda akses langsung ke lokasi terbaik dan terbaru yang diketahui. Biasanya informasi ini sudah tersedia, Anda hanya perlu memintanya.

  • Efisiensi daya: Meminimalkan penggunaan daya aplikasi Anda.

  • Keserbagunaan: Memenuhi berbagai kebutuhan, mulai dari penggunaan latar depan - membutuhkan data lokasi yang sangat akurat, hingga penggunaan di latar belakang - hanya membutuhkan pembaruan lokasi berkala dengan dampak daya yang dapat diabaikan.

Mari kita membangun aplikasi Android berbasis lokasi menggunakan API ini. Untuk ini, kami akan menggunakan IDE yang disarankan Google untuk pengembangan aplikasi Android - Android Studio. Memulai Android Studio cukup mudah. Situs web mereka menjelaskan prosedur yang melibatkan penginstalan dan konfigurasi Android Studio dengan sangat rinci, termasuk cara mem-bootstrap aplikasi Android pertama Anda untuk pengembangan.

Android Studio seharusnya membuat segalanya menjadi sangat mudah bagi kita. Namun, kita harus mulai dengan mengonfigurasi skrip build dan menambahkan Layanan Google Play sebagai dependensi untuk aplikasi ini. Ini dapat dilakukan dengan memodifikasi file “build.gradle” sebagai berikut:

 dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' // Add this line }

Pada saat saya menulis artikel ini, versi terbaru dari Layanan Google Play yang tersedia adalah 6.5.87. Pastikan Anda selalu memeriksa versi terbaru yang tersedia sebelum Anda memulai. Jika versi yang lebih baru keluar nanti dan Anda memutuskan untuk memperbaruinya untuk proyek Anda sendiri, uji semua fitur terkait lokasi terhadap semua versi Android yang Anda dukung.

Pada titik ini, kita harus dapat mulai melakukan pekerjaan sebenarnya untuk aplikasi kita.

Meminta Izin, Mengonfigurasi AndroidManifest.xml

Android memiliki fitur keamanan khusus yang akan mencegah aplikasi sewenang-wenang meminta lokasi pengguna yang tepat. Untuk mengatasi ini, kita perlu mengedit "AndroidManifest.xml" dan menambahkan izin yang kita butuhkan untuk aplikasi ini:

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

Sementara kami melakukannya, kami juga harus menentukan versi Layanan Google Play yang kami gunakan untuk aplikasi ini:

 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

Memeriksa Ketersediaan Layanan Google Play

Sebelum mengakses fitur yang disediakan oleh Layanan Google Play, kami harus memeriksa apakah perangkat telah menginstal Layanan Google Play, dan apakah versi yang akan kami gunakan (6.5.87).

 private boolean checkGooglePlayServices(){ int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(mContext); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * Google Play Services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, mContext, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; }

Metode ini akan memeriksa Layanan Google Play, dan jika perangkat tidak menginstalnya (jarang, tetapi saya telah melihat kasus seperti itu), itu akan membuka dialog dengan kesalahan yang sesuai dan mengundang pengguna untuk menginstal/memperbarui Layanan Google Play dari Google Play Store.

Layanan Google Play

Setelah pengguna menyelesaikan resolusi yang disediakan oleh “GooglePlayServicesUtil.getErrorDialog()”, metode callback “onActivityResult()” diaktifkan, jadi kita harus menerapkan beberapa logika untuk menangani panggilan itu:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(mContext, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } }

Mengakses Google API

Untuk mengakses Google API, kita hanya perlu melakukan satu langkah lagi: membuat instance GoogleApiClient. Klien Google API menyediakan titik masuk umum ke semua layanan Google Play, dan mengelola koneksi jaringan antara perangkat pengguna dan setiap layanan Google. Langkah pertama kami di sini adalah memulai koneksi. Saya biasanya memanggil kode ini dari metode aktivitas "onCreate":

 protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); }

Dengan merangkai serangkaian panggilan metode, kami menentukan implementasi antarmuka panggilan balik dan API Layanan Lokasi yang ingin kami gunakan. Implementasi antarmuka, dalam hal ini "ini", akan menerima respons ke metode "koneksi ()" asinkron ketika koneksi ke Layanan Google Play berhasil, gagal, atau ditangguhkan. Setelah menambahkan kode ini, “MainActivity” kita akan terlihat seperti ini:

 package com.bitwoo.userlocation; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationServices; public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static int REQUEST_CODE_RECOVER_PLAY_SERVICES = 200; private GoogleApiClient mGoogleApiClient; private Location mLastLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkGooglePlayServices()) { buildGoogleApiClient(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private boolean checkGooglePlayServices() { int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(this); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * google play services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, this, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } }

Kemudian dalam metode "onStart" kami, kami memanggil metode "koneksi" dan menunggu metode panggilan balik "onConnected" dipanggil:

 @Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }

Metode "onConnected" akan terlihat seperti ini:

 @Override public void onConnected(Bundle bundle) { mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation != null) { Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } }

Panggilan balik ini diaktifkan ketika Layanan Google Play terhubung, yang berarti pada saat itu kita harus memiliki lokasi terakhir yang diketahui. Namun, lokasi ini bisa nol (jarang tapi bukan tidak mungkin). Dalam hal ini, yang saya sarankan adalah mendengarkan pembaruan lokasi yang akan dibahas selanjutnya.

Mendengarkan Pembaruan Lokasi

Setelah Anda memanggil "getLastLocation", Anda mungkin ingin meminta pembaruan berkala dari Fused Location Provider. Tergantung pada aplikasi Anda, periode ini bisa pendek atau lama. Misalnya, jika Anda membuat aplikasi yang melacak lokasi pengguna saat dia mengemudi, Anda perlu mendengarkan pembaruan dalam interval pendek. Di sisi lain, jika aplikasi Anda adalah tentang berbagi lokasi pengguna dengan temannya, Anda mungkin hanya perlu meminta lokasi sesekali.

Membuat permintaan cukup mudah - Anda dapat memanggil metode ini di dalam metode "onCreate":

 protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(20000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); }

Kami membuat instance objek LocationRequest baru. Atur interval ke 20 detik (20.000 milidetik). Selanjutnya, kami menetapkan kecepatan pembaruan yang dibatasi menjadi 5 detik. Ini memberi tahu API untuk memberikan pembaruan setiap 20 detik (sebaiknya), tetapi jika ada perubahan yang tersedia dalam periode 5 detik, itu juga harus disediakan. Terakhir, kami menetapkan prioritas ke “PRIORITY_HIGH_ACCURACY”, di antara opsi prioritas lain yang tersedia: PRIORITY_BALANCED_POWER_ACCURACY, PRIORITY_LOW_POWER, PRIORITY_NO_POWER.

Setelah Anda membuat permintaan, Anda siap untuk mulai mendengarkan pembaruan lokasi setelah metode "onConnected()" diaktifkan:

 protected void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); }

Yang tersisa sekarang adalah mengimplementasikan metode callback untuk memenuhi antarmuka LocationListener:

 public class MainActivity extends ActionBarActivity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { // ... @Override public void onLocationChanged(Location location) { mLastLocation = location; Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } } 

berhenti mendengarkan pembaruan

Berhenti Mendengarkan Pembaruan

Penting untuk secara eksplisit berhenti mendengarkan pembaruan saat Anda tidak membutuhkannya lagi, atau jika pengguna meninggalkan aplikasi Anda. Metode berikut harus dipanggil dari dalam panggilan balik "onPause":

 protected void stopLocationUpdates() { if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } }

… dan memutuskan hubungan Google API:

 @Override protected void onStop() { super.onStop(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } }

Membungkus

Seperti yang Anda lihat, ide dasar di balik penerapan aplikasi sadar lokasi di Android sangat sederhana. Selain itu, dengan tersedianya API yang mudah digunakan dan mudah dipahami, tidak perlu repot untuk membangun aplikasi berbasis lokasi dasar untuk Android. Aplikasi sampel kecil yang kami buat di sini dimaksudkan untuk menunjukkan hal itu. Anda dapat menemukan kode sumber lengkap untuk ini di GitHub. Harap dicatat bahwa untuk menjaga semuanya tetap sederhana, aplikasi tidak menangani metode panggilan balik "onConnectionFailed".

Semoga tutorial ini akan membantu Anda memulai menggunakan API Layanan Lokasi Google.