개발새발 - IT 기술블로그
article thumbnail

안녕하세요. 이번 글을 쓰게 된 이유는 예전에 같이 알아보았던 디바이스 GPS 센서를 활용한 데이터를 다루는 글의 추가적인 정보를 전달드리기 위해서입니다.

 

예전 글에선 Google Location Service를 사용하여 현재 디바이스의 위치정보와 그 위치정보를 주소로 변환하는 과정까지 진행해 보았었습니다.

 

이번엔 좀 더 디테일한 처리를 위해 실제 사용자가 위치정보를 불러올 수 있는 환경인가? 를 검사하여 정상적으로 불러올 수 있는 환경일 경우에만 불러오는 처리를 간단하게 해 보겠습니다.

 

이번글에 위치를 불러오는 코드는 생략되었으니 혹시나 현재 위·경도 정보나 주소정보를 불러오는 글이 궁금하시면 아래 링크를 달아놓겠습니다.

 

 

https://tekken5953.tistory.com/17

 

[안드로이드] 내 GPS 위치정보 + 상세주소 불러오기 - Google's Location Service

안녕하세요. 이번 포스팅에서는 스마트폰에 내장된 GPS 센서가 측정한 데이터를 불러오고, 상세 데이터로 변환하는 예제를 진행 해보겠습니다. 특정 기술에 대한 이해가 목적이므로 추가적인 학

tekken5953.tistory.com

 

 


 

 

 

본문

 

코드를 작성하기 앞서 기본적인 설명을 드리겠습니다. 

 

위치정보는 크게 두가지 방식으로 불러 올 수 있는데, 첫번째는 디바이스 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로 위치정보를 불러 올 수 없는 상황이라면 시스템 설정이 꺼져있거나, 지하철 혹은 터널같이 위성통신을 할 수 없는 경우에 해당합니다. 그러면 우리는 차선택으로 네트워크를 통해 대략적인 위치정보를 불러올 수 있는지를 확인합니다.

 

만약 네트워크를 사용 할 수 있다면 시스템 설정이 켜져있는 상황으로 판단하고 권한을 검사한 후 위치를 불러오고, 네트워크 또한 사용 할 수 없다면 시스템 설정이 꺼져있다고 간주하고 사용자를 설정 화면으로 이동시킵니다.

 

아래 사진이 시스템 설정 화면입니다.

 

 

 

결론

예전에 포스팅 한 글을 쭉 보면서 단순히 위치정보를 불러와 주소로 변환하는 예제이다 보니 제 글만 보고 실제 프로젝트에 적용 하려고 하면 추가적인 로직이 많이 필요할 것 같다는 생각이 들었습니다. 

 

그 로직들 중 일반적인 경우에 자주 사용하는 설정을 검사하는 부분에 대한 글을 써야겠다고 생각했지만, 조금은 복잡하게 이야기가 진행된 것 같아 아쉬운 마음도 있습니다. 

 

그 이외의 부분들은 프로젝트에 따라 필요한 로직들을 추가하여 처리하는 방향으로 진행하시면 될 것 같습니다. 

 

혹시나 궁금한 점이 있거나 추가적인 설명이 필요한분들은 댓글로 남겨주시면 최대한 도와드리겠습니다.

감사합니다.