Absensi GPS
Arsitektur Sistem
Backend
Frontend
API
  • Struktur
  • Alur Kerja
  • Implementasi GPS
  • Pengembangan dan Pengujian
Deployment
Pengujian
Arsitektur Sistem
Backend
Frontend
API
  • Struktur
  • Alur Kerja
  • Implementasi GPS
  • Pengembangan dan Pengujian
Deployment
Pengujian
  • Implementasi GPS pada Aplikasi Android

Implementasi GPS pada Aplikasi Android

Dokumen ini menjelaskan implementasi fitur GPS pada aplikasi Android Absensi GPS untuk keperluan absensi siswa.

Komponen Utama

Implementasi GPS pada aplikasi Android menggunakan beberapa komponen utama:

  1. LocationHelper: Kelas helper untuk mendapatkan lokasi GPS
  2. Fused Location Provider API: API dari Google Play Services untuk mendapatkan lokasi dengan akurat
  3. Runtime Permission: Permintaan izin lokasi pada saat runtime

1. LocationHelper

LocationHelper adalah kelas helper yang menyediakan fungsi-fungsi untuk mendapatkan lokasi GPS saat ini. Kelas ini menggunakan Fused Location Provider API dari Google Play Services.

class LocationHelper(private val context: Context) {
    private lateinit var fusedLocationClient: FusedLocationProviderClient
    
    init {
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
    }
    
    fun getCurrentLocation(callback: (Location?) -> Unit) {
        if (checkLocationPermission()) {
            fusedLocationClient.lastLocation
                .addOnSuccessListener { location ->
                    if (location != null) {
                        callback(location)
                    } else {
                        requestNewLocationData(callback)
                    }
                }
                .addOnFailureListener {
                    callback(null)
                }
        } else {
            requestLocationPermission()
            callback(null)
        }
    }
    
    // ... kode lainnya
}

2. Izin Lokasi

Aplikasi memerlukan izin lokasi untuk mendapatkan koordinat GPS. Izin yang diperlukan adalah:

  • ACCESS_FINE_LOCATION: Untuk mendapatkan lokasi yang akurat
  • ACCESS_COARSE_LOCATION: Sebagai fallback jika lokasi akurat tidak tersedia

Izin ini dideklarasikan di AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

3. Permintaan Izin pada Runtime

Karena lokasi adalah izin yang sensitif, aplikasi harus meminta izin pada saat runtime (untuk Android 6.0 ke atas). Implementasi permintaan izin dilakukan di MainActivity:

private fun checkLocationPermission() {
    if (ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            Constants.LOCATION_PERMISSION_REQUEST_CODE
        )
    }
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    
    if (requestCode == Constants.LOCATION_PERMISSION_REQUEST_CODE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Izin diberikan, lanjutkan dengan mendapatkan lokasi
        } else {
            // Izin ditolak, tampilkan pesan
            Toast.makeText(
                this,
                "Aplikasi memerlukan izin lokasi untuk melakukan absensi",
                Toast.LENGTH_SHORT
            ).show()
        }
    }
}

4. Mendapatkan Lokasi Saat Absensi

Saat user melakukan absensi (masuk atau keluar), aplikasi akan mendapatkan lokasi GPS saat ini dan mengirimkannya ke server:

private fun absenMasuk() {
    if (!locationHelper.checkLocationPermission()) {
        requestLocationPermission()
        return
    }
    
    showLoading(true)
    
    locationHelper.getCurrentLocation { location ->
        if (location != null) {
            val lokasi = "${location.latitude},${location.longitude}"
            val siswaId = SharedPreferencesManager.getSiswaId()
            
            // Kirim data lokasi ke server
            apiService.absenMasuk(AbsensiRequest(siswaId, lokasi))
                .enqueue(/* ... */)
        } else {
            showLoading(false)
            Toast.makeText(
                this@MainActivity,
                "Tidak dapat mendapatkan lokasi",
                Toast.LENGTH_SHORT
            ).show()
        }
    }
}

5. Format Data Lokasi

Data lokasi yang dikirim ke server menggunakan format string dengan pola "latitude,longitude". Contoh:

"-6.1754,106.8272"

Format ini memudahkan server untuk memproses data lokasi dan menyimpannya di database.

6. Penanganan Error

Aplikasi menangani beberapa kemungkinan error terkait lokasi:

  1. Izin Ditolak: Jika user menolak izin lokasi, aplikasi akan menampilkan pesan bahwa izin lokasi diperlukan untuk absensi.
  2. Lokasi Tidak Tersedia: Jika lokasi tidak dapat diperoleh (misalnya GPS dimatikan), aplikasi akan menampilkan pesan error.
  3. Timeout: Jika proses mendapatkan lokasi terlalu lama, aplikasi akan menggunakan timeout untuk menghindari blocking UI.

7. Optimasi Penggunaan GPS

Untuk mengoptimalkan penggunaan GPS dan menghemat baterai, aplikasi:

  1. Hanya mengaktifkan GPS saat diperlukan (saat absensi)
  2. Menggunakan Fused Location Provider yang sudah dioptimasi oleh Google
  3. Menggunakan prioritas akurasi tinggi hanya saat diperlukan
private fun requestNewLocationData(callback: (Location?) -> Unit) {
    val locationRequest = LocationRequest.create().apply {
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        interval = 5000
        fastestInterval = 2000
    }
    
    // ... kode lainnya
}

Kesimpulan

Implementasi GPS pada aplikasi Android Absensi GPS menggunakan Fused Location Provider API dari Google Play Services untuk mendapatkan lokasi dengan akurat. Aplikasi meminta izin lokasi pada saat runtime dan menangani berbagai kemungkinan error terkait lokasi. Data lokasi dikirim ke server dalam format string "latitude,longitude" untuk diproses lebih lanjut.

Last Updated:: 5/15/25, 10:00 PM
Contributors: Nur Wahyudin