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 :
- Tutorial Menampilkan Maps pada Android Menggunakan Google Maps API v2 dan Maps Fragment
- Tutorial Menampilkan Marker dan InfoWindow pada Android Maps
- Menampilkan Embedded User Location
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…
makasih mas atas tutor2nya saya banyak belajar :)..
btw kalau mau membuat aplikasi berbasis LBS ini disertai input informasi dan gambar dari user lalu dihubungkan dengan database bagaimana ya mas?
terimakasih banyak :))))
Bisa saja, itu lebih kompleks karena kamu butuh server dan web application/web service yang berfungsi untuk menampung data gambar dan informasi yang dikirim dari aplikasi androidnya
mohon maaf kak, mau tanya. saya lagi skripsi yang beruhubungan sama perhitungan waktu maps, itu metode yang tepat digunakan apa yak kak ?
mohon arahannya
mas,,,
saya punya projek LBS sudah fix jadi,,,bisa nampilin marker dan bisa
tp kenapa setelah update SDK saat buka maps hanya muncul layar putih,,,marker nga kliatan,,,
apa karena google play service y nga cocok,,,tadinya pake yg versi 9 ngikutin SDKnya
stelah update jadi versi 16,,,
gimana y mas,,,,terimakasih
Yup, ada perubahan di manifest nya untuk menambahkan version code.
Pastikan juga API KEY nya sudah benar.
Baca lebih lanjut : http://www.twoh.co/2013/04/tutorial-menampilkan-maps-menggunakan-android-maps-api-v2-dan-mapfragment/
saya mendapat error MapsActivity cannot be resolved to a type kira2 apa yah ?
errornya disini ( Intent i = new Intent(getActivity(), MapsActivity.class); )
MapsActivity class nya harus di-import dulu mas bro
bro hafizh gimana caranya applikasi ini berjalan terus walaupun restart , dan terus kirim onLocationChanged ?
bikin background service gan, dan kemudian bikin thread untuk periodically send location updates
mas mau tanya… saya sudah buat untuk projectnya, dan kebetulan support semua tidak ada yang eror, tapi ketika saya jalankan di DEVICE HP Android saya kok tidak bisa ada perintgatan “terhenti” langsung keluar begitu saja, kira-kira yang salah dimana ya mas?
terima kasih.
Errornya bagaimana ya?
Coba cek di logcat http://www.twoh.co/2013/02/mengatasi-force-close-pada-aplikasi-android-menggunakan-logcat/
mas mau tanya ??
saya kok ada eror di bagian (lokasi.getLatD()
bagian mana yang harus diperbaiki??
terimakasih
kodenya lokasi.getLat() dan bukan lokasi.getLatD()
makasih mas hafizh ..
tanya lagi untuk eror di bagian private ArrayList values;
apa buat class lagi ..??
Errornya bagaimana ya?
Coba cek di logcat http://www.twoh.co/2013/02/mengatasi-force-close-pada-aplikasi-android-menggunakan-logcat/
eror private ArrayList values;
apa buat class lagi?
ArrayList harus didefine tipe isinya, contoh yang benar : values;
ArrayList
mas.. kalo untuk menampilkan jarak dari lokasi user ke lokasi tujuan??
contoh source code /link 🙂
monggo, gambaran besar nya di sini http://www.twoh.co/2013/09/menampilkan-rute-tercepat-driving-direction-di-antara-dua-koordinat-pada-android-maps-v2/
Semoga bisa mengikuti 😀
mas, saya ada eror pada bagian MapsActivity ‘import com.map.model.DBLokasi;’ apa harus buat class lagi? sama ada eror di bagian “(lokasi.getLat(), lokasi.getLng());” dan “(lokInit.getLat(), lokInit.getLng());” juga ini “(lok.getLat(), lok.getLng());” ? 😀
Oh iya, untuk source lengkapnya silahkan compile di mari gan https://github.com/twoh/TWOH-MapsV2/
gan, ane mau nanya kalo kita mau nambahin posisi tujuan gimana ya caraanya dan tambahanya, tkhs gan, gasssspollll
Mas gimana caranya jika kita mau membuat pencaian lokasi langsung di map nya?
Data dari pencarian tersebut juga di ambil dari data sqlite yang ada
mohon bantuannya mas
masih pemula 😀 😀
Thanks
berarti kalo mau bikin apps tentang pom bensin terdekat gitu bisa dengan location manager ini kan ya gan
Bisa sekali mas bro, lebih mudah lagi menggunakan Place Picker untuk mengambil data tempat… cek post saya yang ini 🙂
http://www.twoh.co/2015/04/android-places-api-membuat-placepicker-sederhana/
Saya mau tanya, kira2 ada tidak tutorial aplikasi yang berbasis LBS yang membutuhkan server dan web application/web service yang berfungsi untuk menampung data gambar dan informasi yang dikirim dari aplikasi androidnya
Mas database nya dimana
db nya pakai SQLite
Mas hafidz, apakah bisa ketika marker di LBS di sentuh akan menampilkan gambar dan data2 tentang lokasi tsb ?
bisa gan
mas tolong buat tutorial ini yang untuk android studio?
hello mas, apakah mas bs memberikan referensi untuk pembuatan aplikasi android untuk pencarian suatu lokasi menggunakan google maps api v2, contohnya : pencarian rumah makan di bandung, jadi aplikasi tersebut memberikan list rumah makan di bandung, setelah di click salah satu, muncul detail rmh makan yg di pilih dan di bawahnya ada button untuk mengarahkan ke layout peta lokasi rmh makan tersebut. mohon bantuanya
That’s kind of tutorial requires our premium services. 🙂 Go to our Jasa Konsultasi page for more details.
maaf mas, mau tanya, ini lagi ada tugas kuliah membuat LBS leasing yang ada di kota saya, kira kira ada gak tutorialnya mas ?? terimakasih
saat mau di compile kok selalu eror mas package nya main class nya tidak ketemu..
gan,bisa bantu buat tutorial yang kayak gojek??yg bisa ngelacak lokasi penumpang pas masuk di aplikasi dan bisa menghitung jarak perpindahannya??mohon bantuannya gan…thanks
That’s kind of tutorial requires our premium services. ? Go to our “Jasa Konsultasi” page for more details.
Hallo ka, saya mau buat aplikasi semacam gojek tp ini mendeteksi pedagang kaki lima disekitar kita. Nah bagaimana cara mengirim lokasi pedagang ke aplikasi kita agar bs terbaca dan muncul dalam maps terimakasih
kalo itu harus menggunakan back-end server, jadi nanti lokasinya dikirimkan ke server dulu baru setelah itu app bisa fetch location dari server
Malam gan, klo mau menampilkan lokasi terdekat dari posisi kita gimana ya, trus di tampilkan juga waktu tempuh nya, data” nya sdh saya inputkan ke web service, jadi di list gtu kan di urutkan dari yg terdekat, terima kasih gan
Ada bisa menggunakan Direction API dari Google, more info di sini http://www.twoh.co/2013/09/menampilkan-rute-tercepat-driving-direction-di-antara-dua-koordinat-pada-android-maps-v2/
terima kasih mas respon nya, setelah saya gugling ternyata yang saya maksud adalah metode haversine, jadi gini, saya telah menyimpan data id, nama, lat, lng di api, nah skrg saya mau list berdasarkan lokasi terdekat, di tampilkan juga informasi jaraknya, gitu mas..
terima kasih sebelumnya..
tq gan, buat skripsi nih
gan saya kan mau buat aplikasi pencarian hotel, nah untuk memasukan koordinat2 hotelnya gimana yaa???
mas. mau nanya kalau ingin mengetahui titik koordinat menggunakan google maps api melalui android baagaimana caranya ya mas?
maksudnya gimana ya? kalo ingin tahu koordinat lokasi pengguna bisa baca tutorial berikut https://www.twoh.co/2017/02/11/tutorial-belajar-mendapatkan-lokasi-pengguna-di-android-studio-menggunakan-fused-location-api/
halo mas, saya seorang pemadam kebakaran dki jakarta, saya sangat ingin sekali setiap petugas mempunyai aplikasi map yang bilamana sedang terjadi kebakaran dapat dengan mudah meng akses lokasi yg terbakar tersebut lewat aplikasi seperti ini, hingga dapat mempersingkat waktu jarak yg akan di tempuh dan dapat meminimalisir miss communication antar petugas, dan dapat memberikan informasi kepada masyarakat lokasi pos pemadam kebakaran yg terdekat berikut gambar dan nomor tlp pos pemadam tersebut ketika di klik bisa tidak mas?
bisa saja mas
Om ada tutorial yang buat nampilin pencarian lokasi terdekat ?
Permisi mas kok saya error di sini Error:Cannot read packageName from /home/arieftebe/Documents/Portfolio/Android/Tutor/twoh-mapsv2/src/main/AndroidManifest.xml