안녕하세요. 이번 글을 쓰게 된 이유는 예전에 같이 알아보았던 디바이스 GPS 센서를 활용한 데이터를 다루는 글의 추가적인 정보를 전달드리기 위해서입니다.
예전 글에선 Google Location Service를 사용하여 현재 디바이스의 위치정보와 그 위치정보를 주소로 변환하는 과정까지 진행해 보았었습니다.
이번엔 좀 더 디테일한 처리를 위해 실제 사용자가 위치정보를 불러올 수 있는 환경인가? 를 검사하여 정상적으로 불러올 수 있는 환경일 경우에만 불러오는 처리를 간단하게 해 보겠습니다.
이번글에 위치를 불러오는 코드는 생략되었으니 혹시나 현재 위·경도 정보나 주소정보를 불러오는 글이 궁금하시면 아래 링크를 달아놓겠습니다.
https://tekken5953.tistory.com/17
본문
코드를 작성하기 앞서 기본적인 설명을 드리겠습니다.
위치정보는 크게 두가지 방식으로 불러 올 수 있는데, 첫번째는 디바이스 GPS센서를 이용한 정확한(FINE_LOCATION) 위치, 두번째는 네트워크 정보를 이용한 대략적인(COARSE_LOCATION) 위치가 있습니다.
이때, 시스템의 위치 사용이 꺼져있으면 두가지 방법 모두 사용이 불가능합니다. 그래서 우리는 이 두가지 방법의 허용 여부를 검사하여 분기처리하는 예제를 진행해 보겠습니다.
아래는 위치정보와 관련된 설정들을 검사하는 코드입니다. 권한을 검사하는 코드인 RequestPermissionsUtil 클래스는 예전 포스팅의 코드를 사용하였습니다.
// GPS를 사용 가능한 환경인지 확인
fun isGPSConnected(): Boolean {
val lm = context.getSystemService(AppCompatActivity.LOCATION_SERVICE) as LocationManager
return lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
}
// 네트워크를 사용 가능한 환경인지 확인
fun isNetWorkConnected(): Boolean {
val lm = context.getSystemService(AppCompatActivity.LOCATION_SERVICE) as LocationManager
return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
}
// 시스템 위치 서비스를 제어하는 페이지로 유저를 이동
fun requestSystemGPSEnable() {
Toast.makeText(context, "핸드폰 GPS를 켜주세요", Toast.LENGTH_SHORT).show()
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
context.startActivity(intent)
}
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
// GPS 위성 통신이 정상적으로 가능한가?
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
// 위치정보 권한이 허용되어 있는지 검사
if (!RequestPermissionsUtil(this).isLocationPermitted()) {
RequestPermissionsUtil(this).requestLocation()
} else {
// GPS(FINE_LOCATION)로 정확한 위치정보를 불러오는 처리
}
}else {
// 불가능하다면 네트워크 통신은 가능한가?
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
// 위치정보 권한이 허용되어 있는지 검사
if (!RequestPermissionsUtil(this).isLocationPermitted()) {
RequestPermissionsUtil(this).requestLocation()
} else {
// NetWork(COARSE_LOCATION)으로 대략적인 위치정보를 불러오는 처리
}
} else {
// 디바이스의 위치 설정이 꺼져있다고 판단
requestSystemGPSEnable()
}
}
코드설명을 드리면, isGPSConnected 함수는 현재 GPS에 기반한 위치정보를 불러 올 수 있는지를 확인합니다.
그리고 isNetWorkConncted 함수는 네트워크에 기반한 위치정보를 불러 올 수 있는지를 확인합니다.
마지막으로 requestSystemGpsEnable 함수는 시스템 위치가 꺼져있다고 판단하고 허용을 요구하는 페이지로 사용자를 이동시킵니다.
실제 코드를 적용하는 부분에서 처음으로 GPS를 사용 할 수 있는지를 검사하는데, 이렇게 한 이유는 GPS를 통해 정확한 위치를 불러오는 것이 가장 권장되기 때문입니다.
만약 GPS로 위치정보를 불러 올 수 없는 상황이라면 시스템 설정이 꺼져있거나, 지하철 혹은 터널같이 위성통신을 할 수 없는 경우에 해당합니다. 그러면 우리는 차선택으로 네트워크를 통해 대략적인 위치정보를 불러올 수 있는지를 확인합니다.
만약 네트워크를 사용 할 수 있다면 시스템 설정이 켜져있는 상황으로 판단하고 권한을 검사한 후 위치를 불러오고, 네트워크 또한 사용 할 수 없다면 시스템 설정이 꺼져있다고 간주하고 사용자를 설정 화면으로 이동시킵니다.
아래 사진이 시스템 설정 화면입니다.
결론
예전에 포스팅 한 글을 쭉 보면서 단순히 위치정보를 불러와 주소로 변환하는 예제이다 보니 제 글만 보고 실제 프로젝트에 적용 하려고 하면 추가적인 로직이 많이 필요할 것 같다는 생각이 들었습니다.
그 로직들 중 일반적인 경우에 자주 사용하는 설정을 검사하는 부분에 대한 글을 써야겠다고 생각했지만, 조금은 복잡하게 이야기가 진행된 것 같아 아쉬운 마음도 있습니다.
그 이외의 부분들은 프로젝트에 따라 필요한 로직들을 추가하여 처리하는 방향으로 진행하시면 될 것 같습니다.
혹시나 궁금한 점이 있거나 추가적인 설명이 필요한분들은 댓글로 남겨주시면 최대한 도와드리겠습니다.
감사합니다.
'Android' 카테고리의 다른 글
[안드로이드] EditText 입력 키패드(키보드) 올리기 및 내리기 (0) | 2023.06.09 |
---|---|
[안드로이드] 에러 'Cannot invoke setValue on a background thread' 해결 (0) | 2023.06.08 |
[안드로이드] Toast 메시지 누를때마다 갱신시키기 (0) | 2023.04.28 |
[안드로이드] XML뷰에 샘플 데이터 넣기 (0) | 2023.04.19 |
[안드로이드] 배터리 잔량 + 충전상태 불러오기 - BatteryManager (0) | 2023.04.13 |