Last Updated on 11 years by Mas Herdi
Hei all, hari ini karena server sedang di-maintenance saya jadi ada waktu luang. Daripada dibuat untuk menganggur, maka saya putuskan saja untuk menambah satu buah tutorial di sini. 😀 Tutorial kali ini berkaitan dengan mendapatkan lokasi pengguna dari Android, Location Based Services, dan juga tentang GIS, yaitu tentang bagaimana caranya supaya aplikasi bisa auto update mengirimkan lokasi kita ke server tiap jangka waktu tertentu. Fitur ini berguna apabila kita ingin membuat suatu aplikasi tracker, yang bisa melacak lokasi suatu pengguna dan menampilkan jejaknya pada Maps.
Android Sending Location to Server
Bagaimana caranya untuk terus menerus mengirim lokasi koordinat kita ke server? Hal ini bisa dilakukan dengan dua langkah, cara pertama kita harus membuat suatu service pada aplikasi yang akan berjalan pada background. Dan dari service itulah aplikasi akan terus menerus mengirimkan lokasi kita, tanpa mengganggu aplikasi utama yang berjalan di main thread.
Sedangkan untuk proses pengirimannya sendiri atau langkah kedua, kita harus membuat suatu thread yang secara periodik akan mengirimkan koordinat lokasi pengguna ke server. Karena aplikasi kita akan menembak lokasi terus menerus ke server, maka diperlukan sebuah long-running process atau proses yang berjalan dalan jangka waktu yang lama, dan karena itulah kita menggunakan sebuah Thread process yang berjalan pada background service. Sehingga walaupun aplikasi kita close, atau kita keluar dari aplikasi, aplikasi itu tetap akan mengirimkan koordinat lokasi kita ke server.
Crafting Code
Dalam tutorial ini kita akan membuat sebuah thread yang akan mengirimkan lokasi ke server setiap 10 detik. Pertama-tama buatlah sebuah class baru pada Android, yang extends Thread. Masukkan kode di bawah ini pada method run().
public class PeriodicUpdate extends Thread { //...declaration etc @Override public void run() { df = new DecimalFormat("##########.######"); while (true) { try { //get location from your location provider location = MainMaps.getLocation(); if (location != null) { lat = location.getLatitude(); // Updated lat lng = location.getLongitude(); // Updated long } else { String latLongStr = "no lat and longitude found"; } // Call this method when location is updated and save the data. // Send the location to server sendLocation(MainMaps.username, lat, lng); //pause thread every 10 seconds Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } //...declaration etc }
Saya menggunakan DecimalFormat supaya digit pada lokasi yang dikirimkan sesuai dengan settingan pada database server, namun hal itu bisa disesuaikan tergantung dengan keadaan server kalian. Setelah itu pada Thread yang tadi, buatlah sebuah method
sendLocation() baru, yang akan mengirimkan username, latitude, dan longitude ke server.
private void sendLocation(String username, double lat,double lng) { try { httpPost = new HttpPost(url);; // Add your data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3); nameValuePairs.add(new BasicNameValuePair("username", username)); nameValuePairs.add(new BasicNameValuePair("lat", df.format(lat))); nameValuePairs.add(new BasicNameValuePair("lng", df.format(lng))); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request HttpResponse response = httpCl.execute(httpPost); } catch (ClientProtocolException e) { } catch (IOException e) { } }
Jika sudah, sekarang giliran untuk mensetting service yang akan berjalan di background. Caranya pertama-tama kita harus membuat suatu kelas Java yang extends ke kelas Service. Kemudian pada methode onCreate(), kita jalankan thread PeriodicUpdate yang sebelumnya sudah kita inisialisasi terlebih dahulu dengan menggunakan kode t.start().
public class LocationService extends Service { // Thread initialization Thread t = new PeriodicUpdate(); @Override public void onCreate() { super.onCreate(); // starting the thread t.start(); } }
Kemudian pada method onStartCommand() di service kita, kita akan pertama-tama melakukan pengecekan apakah Thread tersebut masih hidup atau tidak. Jika thread-nya ternyata sudah mati, maka thread tersebut akan dinyalakan ulang.
@Override public int onStartCommand(Intent intent, int flags, int startId) { if(!t.isAlive()) { t.start(); } return Service.START_REDELIVER_INTENT; }
Perbedaan antara method onCreate() dan onStartCommand() pada kelas service adalah method onCreate() hanya akan dipanggil sekali saja pada saat kelas service tersebut diinisialisasi, sedangkan method onStartCommand() akan dijalankan setiap kali service tersebut dipanggil dari main thread menggunakan Intent.
Method onStartCommand() akan mengembalikan return value berupa sebuah parameter Service.START_STICKY, yang berarti apabila service tersebut di-kill oleh Android karena memori penuh (umpamanya), maka service itu akan otomatis restart sendiri apabila sudah ada memori yang tersedia. Hal ini menjamin bahwa service akan terus berjalan, dan terus mengirimkan update lokasi ke server.
Setelah itu, kita juga harus mendaftarkan service yang baru kita buat tadi ke AndroidManifest.xml. Masukkan kode berikut di dalam tag <application>.
<service android:name="your.package.name.LocationService" > </service>
Kemudian, kita perlu menyalakan service tersebut dari aplikasi utama pada main thread. Untuk menyalakannya kita tinggal menggunakan kode berikut :
// Start service Intent i = new Intent(this, LocationService.class); this.startService(i);
Voila! Sebuah service sederhana untuk menembak lokasi setiap jangka waktu 10 detik ke server telah dibuat. Tentu ini hanyalah rancangan kasarnya, dan perlu masih banyak improvisasi, seperti fungsi untuk mengecek apakah paket benar-benar sudah sampai, dan juga fungsi untuk queue paket apabila tidak ada koneksi. Dari sisi server-nya sendiri, koordinat lokasi yang sudah dikirimkan bisa ditangkap dengan HTTP GET. Semoga berguna.
saya tertarik dg tutorial android anda, dan saya ptuskan untuk membuat tugs akhir berbasis android, tapi beberapa minggu saya coba . . . banyak kendala mengenai penampilan map didalam virtual android/eclipse, saya menggunakan eclipse kepler dan sdk android . . .
pertanyaan saya, apakah semua tutorial ttg Map itu, bsa dikerjakan dg hanya menggunakan virtual android saja ap tidak? karna saya sndiri blum memiliki android. . . lalu semisal bisa, kira2 versi2 yg anda gunakan jelasnya seperti apa? karna perbedaan versi aplikasi virtual/ eclipse . . banyak juga koding2 yg error . . terima kasih . . . mohon penulis bersedia memberi saya arahan. . . 🙂
Oke, terima kasih karena telah membaca dan mempraktekkan 🙂
Pertanyaan nomer 1, untuk menjalankan aplikasi Maps di Android saat ini tidak bisa dijalankan di emulator. Jadi harus di device asli. Silahkan pelajari di sini : http://www.twoh.web.id/mudengdroid-belajar-android-bersama-twohs-engineering/tutorial-android-dengan-android-maps-google-maps/
Kemudian untuk versinya saya langsung menggunakan Android Development Tools IDE, untuk versi androidnya bisa berjalan d versi 2.2 ke atas.
Pak bisa tolong minta sample projek Auto Update Lokasi ke Server Setiap Jangka Waktu Tertentu..
saya sangat tertarik.
Terima kasih
ionesun55829@yahoo.com
Mas Herdi, bagian MainMaps itu apa ya? hehe saya ingin belajar 😀
MainMaps itu kelas yang berisi Map Activity. Untuk membuatnya bisa belajar dari sini : http://www.twoh.co/mudengdroid-belajar-android-bersama-twohs-engineering/tutorial-android-dengan-android-maps-google-maps/.
ketika kita mengambil lokasi dari GPS, seringnya tidak mendapatkan posisi yang tepat, setelah update beberapa kali baru mendapatkan posisi yang benar dengan akurasi yang dapat disetting.
Ada carakah untuk mendapatkan lokasi yang benar pada waktu pertama kali meminta location pada GPS device?
terima kasih
kalau anda mengambil akses lokasi dari GPS keakuratannya tergantung cuaca,update peta yang anda pakai,untuk menambah akurasi pakai mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
namun itu akan memakan baterai. sepertinya akan lebih efisien dan akurat jika mengambil lokasi dari jaringan provider. setau saya ada 3 metode pengambilan lokasi, 1 gps,2 network provider, 3 google api
Yap benar sekali.
Untuk GPS memang ada mekanisme locking GPS yang harus dilakukan pertama kali sebelum mendapatkan lokasi yang tepat. Bisa juga dengan mengeset Timer, sehingga misal dalam 10 detik tidak mendapatkan lokasi dari GPS, bisa langsung switch provider ke mobile network/internet dan ambil lokasi dari sana.
Jika menggunakan Play Services Location API lebih disarankan lagi, namun saat ini belum sempat buat tutorialnya 😀
mas mau tanya
Intent i = new Intent(this, LocationService.class);
this.startService(i);
kode itu di masukkan di mana ya?
di bagian onCreate pada activity
permisi, ada gak dalam script PHP – Javascript..?
Sepertinya belum ada ya
Gan, itu alamat server nya untuk post datanya disimpan dimana ya?
Biasanya dalam constant di suatu static class. Alamatnya berupa String url.
mas boleh mnta koding dari tutor mas yg sudah fix sampai auto update?
karna saya coba satu2 banyak yang
kalu mas tidak keberatan tolong kirim kan ke choderi04@gmail.com ya mas.
trima kasih.
saya sanggat membutuhkan bantuan mas.
Silahkan berkreasi sendiri gan 🙂 Di sini saya cuma memberikan gambaran besarnya saja
mas saya mau tanya untuk membuat aplikasi android, software apa yang ringan dan bagus untuk digunakan. soalnya saya coba pakai android studio berat banget.
Update PC atau laptopnya, saat ini IDE yang paling bagus dan disarankan adalah Android Studio
saya tertarik dengan tutorial android mas hafizh, dan saya ingin membuat KKP berbasis android seperti tutorial ini. yang saya ingin tanyakan metode atau algoritma apa yang pas buat program ini ya mas mohon pencerahannya hehe terimakasih.
metodenya yang paling sederhana… tinggal bikin Timer di Android saja dan kemudian update lokasi ke server tiap berapa waktu sekali.
Untuk algoritma yang lain bisa setiap pindah 100 meter baru update lokasi, atau jika lokasi lebih akurat baru update lokasi… ada bermacam-macam algoritmanya
mas hafiz, bagaimana caranya bila aplikasi di back, dia akan close. seperti login, setelah login dia pindah ke intent berikutnya, tapi apabila di tekan tombol back dia balik ke form login. saya ingin tahu mengatasi tombol back agar keluar dari aplikasi saja, bukan kembali ke form login. terimakasih
bang ada tutorian buat form login pake database gk???.. kalau ada mohon bantuannya.. maklum masih newbe
Halo Mas Hafidz, salam kenal.
Saya mau tanya boleh? Untuk method getLocation, getLatitude, dan getLongitude diletakkannya di mana ya? Dan isi dari method-method tersebut seharusnya seperti apa? Saya kemarin hanya melakukan quick fix lalu yang dibuat hanya seperti ini.
public static Object getLocation() {
// TODO Auto-generated method stub
return null;
}
Mohon pencerahannya. Masih newbie mas. Hehehe. Terima kasih 🙂
kang ini buatnya di anroid studio atau di eclipse ?
mohon pencerahahannya.
Di Android Studio gan
gan untuk icmp yg dikirim misal tiap 3 jam sekali, (bisa jalan dibackgroud/bisa ping manual), itu codingnya kya gimana ya…dan menampilkan hasil dari icmp tsb apakah reply/time out pada aplikasi dlm bentuk status seperti apa gan?
terima kasih sblmnya.
itu intentnya harus di dalam button ga mas ?
Untuk intent service, tidak harus
kalau menghidupkan gps secara otomatis setiap beberapa menit sekali dari service bisa gk ya mas ?
Bisa saja
Mas, urutan Struktur Java.Class nya bisa ga lebih sturktur nya.. Soalnya dah bolak-balik coba masih error..
truzz, untuk library nya di Modul app (Gradle) apa saja dimasukkan mas?…
Tks
terima kasih mas atas gambaran besarnya tentang long-running process. yang saya ingin tanyakan. bagaimana pembutan di sisi servernya .
Sisi server nya bikin aja satu endpoint yang nerima inputan lat long dalam bentuk HTTP POST.
Setelah itu save datanya ke database
Paling cepet ya pake PHP MySQL 🙂