Mencari Lokasi Dengan GPS Di Android


Saat ini sudah terdapat banyak perangkat Android yang dilengkapi dengan perangkat GPS receiver. Hardware ini akan membaca informasi dari satelit GPS untuk menentukan lokasi perangkat. Jarak perangkat ke sebuah satelit dapat ditentukan dengan mengirim gelombang radio ke satelit dan mengukur selisih waktu dari receiver ke satelit. Setelah menemukan jarak untuk beberapa satelit, posisi perangkat dapat ditemukan dengan menggunakan perhitungan yang disebut trilateration. Sebagai programmer untuk perangkat Android, saya tidak perlu terlibat dalam proses yang kompleks ini karena saya hanya perlu menggunakan class yang ada di package android.location untuk memperoleh data lokasi melalui GPS.

Untuk bisa memakai GPS, saya mendaftarkan penggunaan permission berikut ini pada AndroidManifest.xml:

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

Pada Android API, sebuah lokasi diwakili oleh class Location. Karena class ini terlalu umum, saya akan membuat versi yang lebih spesifik dengan kebutuhan saya (domain class) seperti berikut ini:

public class Lokasi {

    private String nama;
    private double longitude;
    private double latitude;    
    private double altitude;
    private float akurasi;

    public Lokasi(Location location) {
        this.longitude = location.getLongitude();
        this.latitude = location.getLatitude();  
        this.altitude = location.getAltitude();
        this.akurasi = location.getAccuracy();
    }

    public Lokasi(double longitude, double latitude, double altitude, float akurasi) {
        this.longitude = longitude;
        this.latitude = latitude;
        this.altitude = altitude;
        this.akurasi = akurasi;
    }

    public Lokasi(String nama, double longitude, double latitude, double altitude, float akurasi) {
        this(longitude, latitude, altitude, akurasi);
        this.nama = nama;                
    }

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getAltitude() {
        return altitude;
    }

    public void setAltitude(double altitude) {
        this.altitude = altitude;
    }

    public float getAkurasi() {
        return akurasi;
    }

    public void setAkurasi(float akurasi) {
        this.akurasi = akurasi;
    }

}

Nilai latitude (posisi horizontal terhadap khatulistiwa) dan longitude (posisi vertikal terhadap prime meridian) dapat dipakai untuk menentukan posisi sebuah lokasi di bumi. Nilai yang dimiliki oleh Location (sekaligus dipakai di Lokasi) berada dalam format yang disebut sebagai Decimal Degrees (DD). Sebagai contoh, nilai latitude berupa 38,8897 derajat sama dengan 38 derajat 53 menit 23 detik utara pada format Degrees, Minutes, and Seconds (DMS). Angka positif pada latitude mewakili utara dan angka negatif mewakili selatan relatif terhadap khatulistiwa. Pada longitude, angka positif mewakili timur dan negatif mewakili barat relatif terhadap prime meridian.

Agar lebih mudah dibaca oleh pengguna, saya akan menambahkan method koordinatDMS() dan koordinatDD() di class Lokasi yang akan mengembalikan koordinat lokasi dalam format yang dikehendaki seperti pada:

class Lokasi {

  ...

  public String koordinatDMS() {
    return Location.convert(latitude, Location.FORMAT_SECONDS) + " " +
      Location.convert(longitude, Location.FORMAT_MINUTES);
  }

  public String koordinatDD() {
    return latitude + "," + longitude;
  }

}

Nilai altitude pada Location (sekaligus dipakai di Lokasi) adalah nilai dalam satuan meter yang mewakili ketinggian perangkat dihitung mulai dari posisi WGS-84 reference ellipsoid. Perlu diperhatikan bahwa nilai ini bukan ketinggian yang dihitung dari permukaan laut. Hal ini karena nilai permukaan laut yang sesungguhnya terlalu kompleks untuk diproses oleh GPS receiver.

Nilai accuracy pada Location (sekaligus dipakai sebagai akurasi di Lokasi) menunjukkan seberapa akurat nilai latitude dan longitude yang diperoleh dari GPS receiver. Bila sebuah lingkaran digambar dengan jari-jari sepanjang nilai accuracy (dalam satuan meter), maka ada kemungkinan 68% lokasi perangkat berada di dalam lingkaran ini.

Untuk memperoleh sebuah Location, saya perlu memanggil method requestLocationUpdates() dari LocationManager untuk mendaftarkan sebuah LocationListener. Pada listener tersebut, bila lokasi dari GPS telah diperoleh, method onLocationChanged() akan dipanggil. Sebagai latihan, saya membuat sebuah activity dengan nama LokasiActivity yang isinya seperti berikut ini:

public class LokasiActivity extends Activity implements LocationListener {

    private LocationManager locationManager;
    private Lokasi lokasiTerakhir;

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

    @Override
    protected void onStart() {
        super.onStart();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    }

    @Override
    public void onLocationChanged(Location location) {
        lokasiTerakhir = new Lokasi(location);
        TextView output = (TextView) findViewById(R.id.output);
        String strOutput = "DMS: " + lokasiTerakhir.koordinatDMS() + "n" +
            "DD: " + lokasiTerakhir.koordinatDD() + "n" +
            "Altitude: " + lokasiTerakhir.getAltitude() + " mn" +
            "Akurasi: " + lokasiTerakhir.getAkurasi() + " mn";
        output.setText(strOutput);
    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
    }

}

Bila activity di atas dijalankan, informasi dari GPS akan ditampilkan pada sebuah TextView.

Apa yang bisa saya lakukan selain hanya melihat koordinat dari GPS? Sebagai contoh, saya men-share koordinat ini. Untuk itu, saya membuat sebuah deklarasi menu XML seperti berikut ini:

<menu ...>

   <item android:id="@+id/menu_share" app:showAsAction="ifRoom"
      android:title="Share"
      android:actionProviderClass="android.widget.ShareActionProvider" />

</menu>

Saya kemudian memakai menu baru ini dengan menambahkan method onCreateOptionsMenu() pada LokasiActivity:

public class LokasiActivity extends Activity implements LocationListener {

  prvate ShareActionProvider shareActionProvider;
  ...

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem menuShare =  menu.findItem(R.id.menu_share);
    shareActionProvider = (ShareActionProvider) menuShare.getActionProvider();
    return true;
  }

}

Selanjutnya, saya menentukan nilai lokasi yang bisa di-share dengan menambahkan kode program berikut ini pada method onLocationChanged():

public class LokasiActivity extends Activity implements LocationListener {

  ...

  @Override
  public void onLocationChanged(Location location) {
    ...

    // Share lokasi DD
    Intent lokasiDDIntent = new Intent();
    lokasiDDIntent.setAction(Intent.ACTION_SEND);
    lokasiDDIntent.putExtra(Intent.EXTRA_TEXT, lokasiTerakhir.koordinatDD());
    lokasiDDIntent.setType("text/plain");
    shareActionProvider.setShareIntent(lokasiDDIntent);
  }

}

Selain itu, saya juga bisa menambahkan menu untuk menampilkan lokasi pada aplikasi peta default seperti Google Map atau Google Earth. Sebagai contoh, saya menambahkan sebuah item menu baru di deklarasi XML:

<menu ...>

  ...

  <item android:id="@+id/menu_tampil" app:showAsAction="ifRoom"
     android:title="Tampilkan" />

</menu>

Setelah itu, saya menambahkan aksi bila menu tersebut dipilih dengan menggunakan kode program seperti berikut ini:

public class LokasiActivity extends Activity implements LocationListener {

  ...

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    ...
    // Tampilkan di aplikasi peta
    menu.findItem(R.id.menu_tampil).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
      @Override
      public boolean onMenuItemClick(MenuItem item) {
        if (lokasiTerakhir != null) {
          Intent intent = new Intent(Intent.ACTION_VIEW);
          intent.setData(Uri.parse("geo:" + lokasiTerakhir.koordinatDD()));
          if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
          }
        }
        return true;
      }
    });

    return true;
  }

  ...

}

Sekarang, bila menu Tampilkan dipilih, lokasi akan ditampilkan oleh aplikasi yang dapat menampilkan koordinat peta seperti Google Map dan Google Earth.

Perihal Solid Snake
I'm nothing...

4 Responses to Mencari Lokasi Dengan GPS Di Android

  1. Ping-balik: Mencari Arah Dengan Kompas Digital Di Android | The Solid Snake

  2. Ping-balik: Memakai Database SQLite Di Android | The Solid Snake

  3. Ping-balik: Spinal Tap

  4. Mas, mau tanya. Untuk bagian ini “new Lokasi(lokasiTerakhir)” terjadi error.
    Saya merasa kalau ini kaitannya dengan konstruktornya, kalau di class Lokasi, konstruktor yang dibuat parameternya Lokasi(Location location) dia mengambil instance dari kelas Location, bukan kelas Lokasi. Tapi di bagian program tadi itu lokasiTerakhir kan instance dari kelas Lokasi mas. Itu gimana ya solusinya? Yang benar kita gunakan kelas Location yang udah built-in apa Lokasi yang telah dibuat sendiri ya? Terimakasih, mohon bantuannya🙂

    Ini Source codenya :

    // Simpan ke database
    menu.findItem(R.id.menu_simpan).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem item) {
    if (lokasiTerakhir != null) {
    final Lokasi lokasi = new Lokasi(lokasiTerakhir); <<————————-BAGIAN INI
    // Input nama lokasi
    AlertDialog.Builder builder = new AlertDialog.Builder(LokasiActivity.this);
    final EditText txtNamaLokasi = new EditText(LokasiActivity.this);
    builder.setView(txtNamaLokasi).setTitle(“Nama Lokasi”).setPositiveButton(“Simpan”, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    lokasi.setNama(txtNamaLokasi.getText().toString());
    simpan(lokasi);
    }

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: