Android : Auto Update Lokasi ke Server Setiap Jangka Waktu Tertentu

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.





Download aplikasi kami di Google Play Store


Tutorial Menarik Lainnya :

35 Comments
  1. irwan September 6, 2013
  2. iwan March 20, 2014
  3. iwan March 20, 2014
  4. Nisa March 23, 2014
  5. saiful haqqi May 24, 2014
    • musa paradisia November 7, 2014
      • Hafizh Herdi Naufal November 10, 2014
  6. Friska June 20, 2014
  7. Andre July 23, 2014
    • Mhysa November 19, 2014
  8. Gumilar August 15, 2014
    • Hafizh Herdi Naufal November 10, 2014
  9. choderi December 11, 2014
  10. choderi December 11, 2014
    • Hafizh Herdi Naufal December 14, 2014
  11. Dimas Bagus Prasetyo March 25, 2015
    • Hafizh Herdi Naufal March 26, 2015
  12. dimas May 20, 2015
    • Hafizh Herdi May 22, 2015
      • dimas July 7, 2015
  13. andyfauzi November 21, 2015
  14. Diana Nur Amalina April 14, 2016
  15. muhammad said February 12, 2017
  16. Aldo February 28, 2017
  17. suut August 28, 2017
  18. Egi October 26, 2017
  19. Joe_ant January 15, 2018
  20. indra saputra February 13, 2018
    • Hafizh Herdi February 13, 2018

Leave a Reply

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

TWOH&Co.