이번 글은 스마트폰에 탑재되어 있는 GPS를 이용하여 사용자의 현재 위치를 불러오는 방법을 설명하는 글을 작성해보도록 하겠습니다.
여기에 나오는 코드는 현재 진행중인 Team 프로젝트에 나오는 코드를 가지고 온 것입니다.
GPS를 사용하기 위해 Manifest에서 선언할 권한은 두가지 이다.
ACCESS_FINE_LOCATION : GPS와 Network를 모두 사용하여 사용자의 정확한 위치를 가지고 오는 권한 코드이고
ACCESS_COARSE_LOCATION : Network만을 사용하여 사용자의 대략적인 위치를 가져오는 권한 코드이다.
companion object {
val locationPermissions = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
private val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
val responsePermissions = permissions.entries.filter {
it.key in locationPermissions
}
if (responsePermissions.filter { it.value == true }.size == locationPermissions.size) {
setLocationListener()
} else {
Toast.makeText(this, "no", Toast.LENGTH_SHORT).show()
}
}
permissionLauncher에서 권한이 동의되었는지를 확인한다.
object안에 Array의 사이즈는 2이고 responsePermissions.filter에서 true의 개수와 locationPermissions의 size의 비교해서 권한이 2개다 true인지 확인한다. true이라면
setLocationListener()메서드를 동작시키고 false라면 no라는 메시지를 출력하게 해놨다.
private fun getMyLocation() {
if (::locationManager.isInitialized.not()) {
locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager
}
val isGpsEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
if (isGpsEnable) {
permissionLauncher.launch(locationPermissions)
}
}
LocationManager은 시스템 서비스로 this.getSystemService(Context.Location_SERVICE)를 얻어서 온다.
locationManager.isProviderEnabled를 통해 위치 정보를 가져올 수 있는지 사용 가능 여부를 체크한다.
그 후 permissionLauncher.launch(locationPermissions)을 실행하면 사용자의 위치를 좌표롤 받아옵니다.
단순히 좌표만 받아온다면 사람은 직관성이 떨어지게 됩니다. 그렇기에 getReverseGeo라고 불리는 기능을 활용해 사람이 알아보기 쉬운 xx시 xx구 xx동 xx번지 식으로 변경이 가능하다.
좌표를 xx시 xx구 xx동 xx번지 식으로 변경하는 방법에 대한 글은 다음에 작성해보도록 하겠습니다. 읽어주셔서 감사합니다.