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.

Ketika pertama kali aplikasi dibukaKetika pertama kali aplikasi dibuka

Setelah itu, inilah tampilan aplikasi ketika tombol fetch location diklik :

Ketika tombol fetch location diklikKetika 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. 🙂



Download aplikasi kami di Google Play Store