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