Last Updated on 10 years by Mas Herdi
Hey semua. Maaf akhir-akhir ini sudah jarang lagi menulis postingan dikarenakan sibuk bekerja dan bermain Dota 2. hehehe Oke, kali ini saya akan menulis tutorial tentang bagaimana cara mendapatkan lokasi pengguna menggunakan Google Play Services Location APIs. Yeah, mungkin banyak dari kalian yang belum pernah mendengarnya. Biasanya kita menggunakan Android Location APIs framework untuk mendapatkan lokasi pengguna, yang lebih ribet, karena kita harus memikirkan provider, timeout, akurasi dan sebagainya. Banyak juga tutorial-tutorial saya sebelumnya yang menggunakan Android Location APIs untuk mendapatkan lokasi pengguna.
Google Location Services APIs
Nah, kali ini kita akan menggunakan Location APIs baru yang ditawarkan oleh Google. Location APIs ini digabungkan ke dalam Google Play Services library, menjadi satu paket bersama dengan Google Maps Android APIs v2, AdMob, dan banyak lagi.
Keuntungan dari menggunakan Google Location APIs ini antara lain adalah, kita bisa mendapatkan lokasi pengguna dengan cara yang sangat simple, tidak seperti Android Location APIs. Mekanismenya adalah, kita akan membuat sebuah LocationClient di lokal, kemudian kita tinggal menghubungkan LocationClient tersebut ke Play Services. Setelah terhubung, lokasi pengguna pun bisa kita dapatkan dari LocationClient. Sangat simpel, tanpa perlu memikirkan provider, akurasi, dan lain sebagainya.
Fitur-fitur unggulan lainnya adalah :
- fused location provider, akurasi lokasi akan diberikan tergantung kebutuhan kita, provider akan dipilih secara otomatis berdasarkan permintaan.
- low power, tidak perlu ada jeda menunggu lokasi seperti pada Android Location APIs
- immediately available, begitu connect ke service, kita langsung bisa mendapatkan lokasi pengguna yang paling terakhir dan paling baik.
- support geofencing
Satu-satunya kerugian adalah, karena Location APIs ini bundled ke dalam Google Play Services library, maka aplikasi yang menggunakan APIs ini tidak bisa berjalan pada devices yang mengalami perombakan total pada Android, sehingga tidak mengikutsertakan Play Services atau Play Store di dalamnya, seperti Kindle Fire, atau Xiaomi.
TWOH’s Maps Util
Oke, langsung saja kita buat sample aplikasinya bernama TWOH’s Maps Util :). Tentu saja namanya bisa diganti nantinya.
Pertama-tama, kita akan membuat sebuah MainActivity yang akan implement interface dari GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, dan LocationListener. ConnectionCallbacks digunakan untuk mengetahui apakah koneksi dari LocationClient ke services berhasil atau tidak. OnConnectionFailedListener digunakan untuk menghandle ketika terjadi kegagalan saat koneksi. Dan LocationListener digunakan untuk mengetahui ketika apabila ada update lokasi.
Oke, sebelumnya mari kita membuat file layout-nya terlebih dahulu. Bernama activity_main.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/tv_top" android:text="TWOHs Maps Util" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_below="@+id/tv_top" android:id="Get Location" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bt_getLocation" /> <Button android:layout_below="@+id/bt_getLocation" android:id="Geocoding Coordinate" android:text="@string/bt_geocoding" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
Setelah itu, kita langsung buat kode untuk MainActivity-nya. Copy paste kan saja kode di bawah ini ke dalam kelas MainActivity.java yang kalian buat.
package id.web.twoh.playLocation; import android.location.Location; import android.location.LocationListener; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient; import com.google.android.gms.location.LocationClient; public class MainActivity extends FragmentActivity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationListener { private LocationClient locationClient; private Location currentLocation; private Button btLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // inisialisasi Location Client locationClient = new LocationClient(this,this,this); btLocation = (Button) findViewById(R.id.bt_getLocation); btLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(locationClient.isConnected()) { // get location dari LocationClient apabila sudah tersambung currentLocation = locationClient.getLastLocation(); Toast.makeText(MainActivity.this,"Current Last Location "+currentLocation,Toast.LENGTH_LONG).show(); }else if(locationClient.isConnecting()) { Toast.makeText(MainActivity.this,"still connecting",Toast.LENGTH_SHORT).show(); } } }); } @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); } @Override public void onConnected(Bundle bundle) { // toast yang muncul ketika client tersambung ke services Toast.makeText(this,"connected to location services",Toast.LENGTH_SHORT).show(); } @Override public void onDisconnected() { // toast yang muncul ketika sambungan client terputus dari services Toast.makeText(this,"disconnected to location services",Toast.LENGTH_SHORT).show(); } @Override public void onLocationChanged(Location location) { // method yang dipanggil ketika ada location update currentLocation = location; Toast.makeText(this,"location changed to "+location.getLatitude()+" "+location.getLongitude(),Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String s, int i, Bundle bundle) { } @Override public void onProviderEnabled(String s) { } @Override public void onProviderDisabled(String s) { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { /* Method ini akan dipanggil ketika sambungan gagal. Pada method ini biasanya dilakukan pengecekan apakah ada Play Services atau Play Stores terinstall pada devices.*/ } @Override protected void onStart() { super.onStart(); // menyambungkan LocationClient ke services pada saat aplikasi dimulai locationClient.connect(); } @Override protected void onStop() { super.onStop(); // memutus sambungan dari services apabila lokasi ditutup if(locationClient.isConnected()) locationClient.disconnect(); } }
Penjelasan dari kode di atas sudah saya tuliskan dalam bentuk komentar pada kode di atas untuk tiap-tiap method atau bagian. Secara garis besarnya, pada saat dimulai aplikasi ini akan mencoba untuk koneksi ke Google service, setelah LocationClient tersambung ke service, maka akan muncul Toast notifikasi bahwa LocationClient sudah tersambung. And that’s it, ketika sudah tersambung, maka kita bisa langsung mengambil lokasi dari LocationClient.
Terakhir, kita akan sedikit mengupdate file AndroidManifest.xml untuk menambahkan beberapa permissions dan metadata Play Services, gantilah supaya sama seperti kode di bawah ini :
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="id.web.twoh.playLocation" > <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="id.web.twoh.playLocation.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> </manifest>
Demo
Ketika pertama kali dijalankan, akan muncul notifikasi berupa toast yang menandakan LocationClient telah berhasil tersambung ke services.
Setelah itu, inilah tampilan aplikasi ketika tombol fetch location diklik :
Pada toast notification bisa dilihat info, yaitu koordinat lokasi, kemudian nama provider, akurasi lokasi dan informasi lainnya.
That’s all. Apabila ada yang ingin ditanyakan, silahkan bertanya lewat komentar atau forum. 🙂
saya sudah ikuti semua tutor tapi terdapat error tanda merah, salah satunya :
1. android:text=”@string/bt_getLocation”/>
2. android:text=”@string/bt_gecoding”/>
3.
4. import com.google.android.gms.common.ConnectionResult;
5. import com.google.android.gms.common.GooglePlayServicesClient;
6. import com.google.android.gms.location.LocationClient;
……
mohon pencerahannya, Terimakasih ^_^