우찬쓰 개발블로그

안드로이드 코드상으로 위치 모드 변경 (change location priority programmatically) 본문

안드로이드/안드로이드 개발

안드로이드 코드상으로 위치 모드 변경 (change location priority programmatically)

이우찬 2019. 7. 4. 19:38
반응형

앱 개발을 하다보면 GPS를 사용하여 위경도 값을 얻어와야 하는 경우가 있다.

 

GPS 위치 모드 설정에 따라서 GPS의 측정정확도가 다른데 기본적으로 측정정확도는 디폴트가 '기기전용'으로 되어있다.

 

안드로이드 설정에서 위치 모드로 들어가면 세가지 종류가 있는데, 그 세가지는 다음과 같다.

 

 

높은 정확성(GPS, Wifi, 블루투스, 이동통신망)

 

배터리 절약(Wifi, 블루투스, 이동통신망)

 

기기 전용(GPS만 이용)

 

 

당연히 GPS 값을 가장 잘 얻어오는 모드는 높은 정확성 이다.

 

그래서 앱에서 GPS 값을 잘 가져오기 위해서는 높은 정확성으로 바꿔주는 것이 중요한데, 이게 생각보다 샘플코드를 찾기가 어려웠다.

 

결론적으로는 아래와 같은 코드를 짜게 되었다.

 

먼저 gradle에 라이브러리를 추가해주어야한다.

 

implementation 'com.google.android.gms:play-services-location:15.0.1'

 

그리고 요청이 필요한 Activity에 다음과같은 로직이 필요하다.

/**
 * GPS 설정 변경 요청.
 */
private fun requestGpsSettingChange() {
    val locationRequest = LocationRequest.create()
    locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

    val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
    val result = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build())

    result.addOnCompleteListener {
        try {
            it.getResult(ApiException::class.java)// 설정이 안되어있는경우 catch로 빠짐.
            
            //이미 설정되어있는 경우 catch로 빠지지 않음.
            //startConfirmLogic
        } catch (e: ApiException) {
            when(e.statusCode) {
                LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> {
                    val resolvable = e as ResolvableApiException
                    resolvable.startResolutionForResult(this@YourActivity, CODE_LOCATION)
                }
            }
        }
    }
}

 

RESOLUTION_REQUIRED는 유저에게 권한요청이 필요한 예외인데, 여기서 다이얼로그가 뜨게된다.

 

그리고 유저의 선택에 따라 다음과 같은 분기처리가 필요하다.

 

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if(requestCode == CODE_LOCATION){
        if(resultCode == Activity.RESULT_OK){
            //startConfirmLogic
        }else {
            //유저가 거부한 경우의 로직
        }
    }
}

 

누군가에게 도움이 되었으면 한다.

반응형
Comments