Lokasi (Bagian 1: Android Location API)

Dengan GPS (Global Positioning Service), suatu device dapat diketahui posisi geolokasinya. GPS menggunakan 24 satelit yang memancarkan sinyal secara bersamaan. Sinyal tersebut berisi waktu kirim (yang sangat akurat) dan posisi satelit. Device akan menerima sinyal satelit itu secara pasif (tidak memancarkan sinyal, hanya menerima). Berdasarkan kecepatan sinyal sampai ke device maka dapat ditentukan jarak antara device dengan satelit. Minimal diperlukan empat satelit berbeda untuk menentukan lokasi. Selain GPS, Rusia mengembangkan sistem serupa yang disebut GLONASS dan Eropa mengembangkan Galileo.

Hampir semua device Android mendukung GPS dan sebagian mendukung kombinasi GPS + GLONASS. Selain itu Android mendukung penentuan lokasi berbasis network yang memanfaatkan cell tower dan wifi. GPS lebih akurat dibandingkan network location provider, tetapi membutuhkan waktu lebih lama, akses ke langit dan lebih boros batere.

Ada dua cara app Android untuk mendapatkan lokasi, pertama dengan Android Location API dan kedua dengan Google Location API. Google Location API lebih simple API-nya, lebih hemat batere, cepat memperoleh lokasi tapi bergantung pada Google Play Service. Pada bagian ini, kita akan membahas mengenai Android Location API terlebih dulu baru kemudian Google Location API. Kita akan mencoba membuat aplikasi sederhana yang mengambil lokasi. Untuk lebih memahami proses pengambilan lokasi, sebaiknya jalankan app langsung pada device bukan AVD.

Buat project baru. Edit AndroidManifest.xml karena app membutuhkan ijin dari user untuk mengakses lokasi. Gunakan ACCESS_COARSE_LOCATION untuk lokasi berdasarkan network dan ACCESS_FINE_LOCATION untuk lokasi berdasarkan GPS. Jika kita menggunakan FINE_LOCATION maka tidak perlu lagi meminta COARSE_LOCATION karena otomatis sudah termasuk (gambar bawah).

loc_1_1

Untuk mengambil lokasi, kita akan buat activity yang meng-implement LocationListener dan kemudian dipassing ke LocationManager.

public class MainActivity extends Activity implements LocationListener {

Pertama tambahkan tiga textview dalam activity_main.xml. Ganti id dengan tvStatus, tvLat dan tvLng (gambar bawah).

loc_1_2

Berikut adalah code lengkap untuk class MainActivity, perhatikan comment yang ada. Jalankan langsung di-device.


import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.text.format.Time;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity implements LocationListener {

    TextView tvLat;
    TextView tvLng;
    TextView tvStatus;
    double lat;
    double lng;
    long minTime;
    float minDistance;
    String locProvider;
    LocationManager locMgr;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.activity_main);

	    tvStatus = (TextView) findViewById(R.id.tvStatus);
	    tvLat =  (TextView) findViewById(R.id.tvLat);
	    tvLng =  (TextView) findViewById(R.id.tvLng);

	    // ambil location manager
	    locMgr = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

	    //ambil lokasi terakhir berdasarkan network agar cepat
	    //user dapat kesal jika diawal menunggu terlalu lama app mendapatkan lokasi
	    tvStatus.setText("ambil lokasi terakhir berdasarkan network");
	    locProvider = LocationManager.NETWORK_PROVIDER;
	    Location lastKnownLocation = locMgr.getLastKnownLocation(locProvider);
	    lat = lastKnownLocation.getLatitude();
	    lng = lastKnownLocation.getLongitude();
	    tvLat.setText(String.valueOf(lat));
	    tvLng.setText(String.valueOf(lng));

	    //sambil user melakukan aktivitas2 (misalnya)
	    //maka ambil lokasi yang lebih akurat dan terus mendengarkan
	    //perubahan lokasi device

	    //selanjutnya plih provider yang tinggi akurasinya
	    //dengan mengeset Criteria, tapi ingat semakin tinggi
	    //akurasi maka semakin boros menggunakan batere

	    Criteria cr = new Criteria();
	    cr.setAccuracy(Criteria.ACCURACY_FINE);

	    //contoh penggunaan criteria yang lain:
	    //akurasi relatif rendah, tapi paling hemat batere
	    //cr.setAccuracy(Criteria.ACCURACY_COARSE);
	    //cr.setPowerRequirement(Criteria.POWER_LOW);

            //berdasarkan kriteria, sistem akan memberikan
	    //provider yang paling tepat
	    locProvider = locMgr.getBestProvider(cr, false);

	    //1 menit: waktu refresh lokasi dalam milidetik (1*60*1000)
	    //pilih selama mungkin untuk menghemat batere tapi
	    //user masih bisa menerima
	    //long minTime = 1 * 60 * 1000;

	    minTime = 5 * 1000; //lima detik

	    //posisi pergeseran dalam meter
	    //lokasi akan diupdate jika telah melewati batas distance
	    minDistance = 1;

	    //onResume akan dipanggil dan mulai mendengarkan pergantian lokasi
	}

	@Override
	protected void onResume() {
	    //mulai mendengarkan dari awal dan juga saat dibangunkan dari pause
            super.onResume();
	    locMgr.requestLocationUpdates(locProvider, minTime, minDistance, this);
	}

       @Override
	protected void onPause() {
    	   //lepaskan listener, agar tidak memakan resources saat dipause
	    super.onPause();
	    locMgr.removeUpdates(this);
	}

	@Override
	public void onLocationChanged(Location loc) {
	     //dipanggil saat lokasi berubah atau waktu refersh

	    lat = loc.getLatitude();
	    lng = loc.getLongitude();
	    tvLat.setText(String.valueOf(lat));
	    tvLng.setText(String.valueOf(lng));

	    Time now = new Time();
	    now.setToNow();

	    tvStatus.setText("Direfresh berdasarkan:  "+locProvider
                   +" Waktu: "+now.hour+":"+now.minute+":"+now.second);
	}

	@Override
	public void onProviderDisabled(String provider) {
	}

	@Override
	public void onProviderEnabled(String provider) {
	}

	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {
	}

}

Jika dijalankan maka pada saat awal lokasi akan diisi dengan cepat berdasarkan data terakhir (network). Perhatikan icon GPS di kiri atas yang menyatakan GPS mulai diaktifkan (gambar bawah)

loc_1_3

Setelah beberapa saat (bawa device ke dekat jendela atau ruang terbuka atau lapangan). Maka akan muncul lokasi berdasarkan GPS yang diupdate setiap 5 detik. Jika anda berada di dalam ruangan tertutup, maka layar dibawah tidak akan pernah muncul karena lokasi GPS tidak pernah didapatkan:

loc_1_4

Tip: Untuk menghemat batere, dapat dilakukan caching lokasi
(http://developer.android.com/guide/topics/location/strategies.html).

Tip: Untuk mendapatkan lokasi berdasarkan GSM, pastikan uncheck Settings -> Applications -> Development -> Allow mock locations

Berlanjut di bagian 2 :  Google Location API

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.