Membuat Aplikasi Location Based Services di Android Menggunakan Maps API v2

Last Updated on 10 years by Mas Herdi

Pre-Requisites

Untuk membuat tutorial ini, kalian harus mempelajari beberapa tutorial yang pernah saya tulis sebelumnya. Karena itu saya sarankan agar kalian membaca daftar tutorial di bawah ini sebelum melanjutkan ke langkah berikutnya :

Pada link ketiga, kalian akan belajar bahwa sebenarnya kita bisa menampilkan lokasi pengguna pada peta hanya dengan mengklik tombol pada peta. Namun itu adalah fungsi yang sudah ada di Android Maps, dan kita tidak bisa mendapatkan data koordinat dari sana.

Down to Code

Oke, pertama-tama kita akan membuat tampilannya. Sama seperti di postingan sebelumnya, aplikasi ini akan mempunyai dua tampilan, yaitu tampilan Menu dan tampilan Maps yang akan menampilkan peta dan lokasi pengguna.

Oh ya, jika kalian menggunakan SDK Android terbaru, maka Main Activity yang ter-create akan mempunyai dua buah layout xml, yaitu layout untuk Activity tersebut dan layout untuk Fragment. Berikut ini adalah layout untuk Activity-nya :

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="id.web.twoh.twohmaps.MainActivity"
    tools:ignore="MergeRootFrame" />

Dan ini adalah layout untuk fragment, berisi tombol-tombol navigasi, yaitu tombol Check-In, tombol Get Location, tombol About, dan tombol View On Map :

fragment_main.xml

<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    android:background="@drawable/bg_main"
    android:gravity="center_horizontal|center_vertical"
    tools:context="id.web.twoh.twohmaps.MainActivity$PlaceholderFragment" >

   <TextView
        android:id="@+id/NamaProgram"
        android:text="TWOH Maps v2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:textStyle="bold"
        />
    <Button
		 android:id="@+id/btGetLocation"
		 android:text="Get Location"
		 android:layout_width="wrap_content"
		 android:layout_height="wrap_content"
	/>
    <Button
		 android:id="@+id/btViewOnMap"
		 android:text="View On Map"
		 android:layout_width="wrap_content"
		 android:layout_height="wrap_content"
	/>
    <Button
		 android:id="@+id/btCheckIn"
		 android:text="Check In"
		 android:layout_width="wrap_content"
		 android:layout_height="wrap_content"
	/>
    <Button
		 android:id="@+id/btAbout"
		 android:text="About"
		 android:layout_width="wrap_content"
		 android:layout_height="wrap_content"
	/>

</LinearLayout>

Kemudian untuk isi dari MainActivity nya sendiri adalah sebagai berikut :

package id.web.twoh.twohmaps;

import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
import id.web.twoh.twohmaps.R;

public class MainActivity extends ActionBarActivity {

	protected LocationManager locationManager;
	private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 10; // dalam Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 60000; // dalam Milliseconds

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

		if (savedInstanceState == null) {
			getSupportFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}

		 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
	        locationManager.requestLocationUpdates(
	                LocationManager.GPS_PROVIDER,
	                MINIMUM_TIME_BETWEEN_UPDATES,
	                MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
	                new MyLocationListener()
	        );
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.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();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	protected void showCurrentLocation() {
    	Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location != null) {
            String message = String.format(
                    "Lokasi saat ini \n Longitude: %1$s \n Latitude: %2$s",
                    location.getLongitude(), location.getLatitude()
            );
            Toast.makeText(this, message,
                    Toast.LENGTH_LONG).show();
            }

    }   

    private class MyLocationListener implements LocationListener {

        public void onLocationChanged(Location location) {
            String message = String.format(
                    "Deteksi Lokasi Baru \n Longitude: %1$s \n Latitude: %2$s",
                    location.getLongitude(), location.getLatitude()
            );
            Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
            //switchToMap();
        }

        public void onStatusChanged(String s, int i, Bundle b) {
            Toast.makeText(MainActivity.this, "Status provider berubah",
                    Toast.LENGTH_LONG).show();
        }

        public void onProviderDisabled(String s) {
            Toast.makeText(MainActivity.this,
                    "Provider dinonaktifkan oleh user, GPS off",
                    Toast.LENGTH_LONG).show();
        }

        public void onProviderEnabled(String s) {
            Toast.makeText(MainActivity.this,
                    "Provider diaktifkan oleh user, GPS on",
                    Toast.LENGTH_LONG).show();
        }

    }

	public static class PlaceholderFragment extends Fragment {

		private Button btMaps;
		private Button btCheckIn;
		private Button btGetLocation;
		Location location;
		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			btMaps = (Button)rootView.findViewById(R.id.btViewOnMap);
			btMaps.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					switchToMap();
				}
			});
			btCheckIn = (Button)rootView.findViewById(R.id.btCheckIn);
			btCheckIn.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					switchToCheckIn();
				}
			});
			btGetLocation = (Button) rootView.findViewById(R.id.btGetLocation);
			btGetLocation.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					showCurrentLocation();

				}
			});
			return rootView;
		}

		@Override
		public void onActivityCreated(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			location = ((MainActivity)getActivity()).locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
			if(location==null)
			{
				location = ((MainActivity)getActivity()).locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
			}
		}

		private void switchToMap()
		{
	    	Intent i = new Intent(getActivity(), MapsActivity.class);
	    	Bundle b = new Bundle();
	    	if(location!=null)
	    	{
	    	b.putDouble("longitude", location.getLongitude());
	    	b.putDouble("latitude", location.getLatitude());
	    	Log.v("info", "The lat "+location.getLatitude());
	        Log.v("info", "The lng "+location.getLongitude());
	        i.putExtras(b);
	    	startActivity(i);
	    	}else
	    	{
	    		Toast.makeText(getActivity(), "Nyalakan lokasimu", Toast.LENGTH_LONG).show();
	    	}
		}

		public void switchToCheckIn()
	    {

	    	//not yet implemented
	    }

		protected void showCurrentLocation() {
	        if (location != null) {
	            String message = String.format(
	                    "Lokasi saat ini \n Longitude: %1$s \n Latitude: %2$s",
	                    location.getLongitude(), location.getLatitude()
	            );
	            Toast.makeText(getActivity(), message,
	                    Toast.LENGTH_LONG).show();
	            }

	    }
	}

}

Kelas MainActivity.java berfungsi sebagai driver yang mengarahkan tombol-tombol di main menu ke activity yang sesuai. Perbedaan dengan aplikasi LBS sebelumnya, kelas ini diimplementasikan menggunakan arsitektur Fragment sehingga MainActivity sebenarnya hanyalah kelas container, dan fungsi-fungsi yang digunakan ada di dalam Fragment yang bernama “PlaceholderFragment”.

Selebihnya, kelas ini juga berfungsi untuk mendeteksi lokasi user, seperti di postingan LBS yang lama. Untuk bisa mendeteksi lokasi, pertama-tama kita harus menginstansiasi kelas Location Manager yang berfungsi untuk mengakses location services, location manager akan diturunkan dari kelas parent Context dan didapatkan lewat method getSystemService() . Kemudian kita meminta update lokasi dari perangkat menggunakan method requestLocationUpdates(), pada method itu kita akan menggunakan beberapa parameter, yaitu jenis provider layanan lokasi yang diinginkan (pada kasus ini adalah layanan GPS), kemudian interval minimum untuk pemberitahuan (dalam milisekon), jarak minimun untuk pemberitahuan (dalam meter), dan yang terakhir adalah sebuah kelas yang mengimplementasikan LocationListener. Location Listener seperti yang telah dijelaskan di atas, berfungsi untuk memantau perubahan pada lokasi pengguna dan juga perubahan pada status provider.
Lanjut ke halaman 3…





Download aplikasi kami di Google Play Store


Tutorial Menarik Lainnya :

51 Comments
  1. guge faizal August 11, 2014
    • Hafizh Herdi Naufal August 29, 2014
      • Gagas September 13, 2016
  2. chandra yudhistira September 15, 2014
  3. friandi September 26, 2014
    • friandi September 26, 2014
  4. friandi October 1, 2014
    • Hafizh Herdi Naufal October 29, 2014
  5. rorik Budi October 6, 2014
  6. arif October 19, 2014
  7. Harry November 11, 2014
  8. ragil December 28, 2014
  9. Fitra April 20, 2015
  10. Chiku April 20, 2015
  11. Herdian Chandra April 25, 2015
  12. Rizky May 4, 2015
  13. adrian June 10, 2015
  14. gon June 19, 2015
  15. Sean July 27, 2015
    • Hafizh Herdi July 27, 2015
  16. Boy An March 5, 2016
  17. bagus April 15, 2016
  18. sukmo June 12, 2016
    • Hafizh Herdi June 12, 2016
  19. Amelia October 19, 2016
    • Hafizh Herdi October 20, 2016
  20. khairil November 13, 2016
  21. bobeat November 20, 2016
  22. aditya pratama January 18, 2017
  23. norhadi March 2, 2017
  24. rudy wahyudy March 15, 2017
  25. danang August 3, 2017
  26. Arief Turbagus October 27, 2017

Leave a Reply

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

TWOH&Co.