[android] google location service

hyewoon·2024년 1월 11일

android

목록 보기
4/8
  • 개요

✅ 지속적으로 위치 불러오기
✅ 이동 거리 계산
✅ 이동시간 계산하기


라이브러리 추가

<build.gradle>

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

권한 추가

<Manifests.xml>

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

    <!-- 필요에 의해 사용 -->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

runtime permission 추가

 private fun requestLocationPermission() {
        if (ContextCompat.checkSelfPermission(
                this,
                android.Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),
                LOCATION_PERMISSION_REQUEST_CODE
            )
        } else {
            requestLocationUpdates() 
        }
    }

fused location client 추가

내 기기에서 위치정보 알려면 google location service API에서 제공하는 FusedLocationProviderClient를 이용해야 한다.

✅ 이동 거리 구하기

참고
https://chat.openai.com/c/ce3f4bbe-1971-4f14-8d7c-afecca8fec36


역시 ChatGPT3.5 에게 묻고 힌트를 얻었다.

  1. Location 클래스 내부의 distanceTo() 메소드 이용
  2. distanceTo() 메소드 : 현재 위치.distanceTo( 이전 위치 )
  • 이전 위치 :
    var lastLocation : Location? = null
  • 현재 위치 :
    Callback 인터페이스에서 받은
    val newlocation = locationResult.lastLocation
  1. lastLocation 상태
    lastLocation != null 이면 조건문 실행
    lastLoation == null 이면 lastLocation에 newLocation을 대입
    그러면 lastLocation != null이므로 조건문 실행한다.

  2. 조건문 내부에서 distanceTo() 메소드 이용하여 거리 구하기

  • 전체 코드
    private val mLocationCallback = object : LocationCallback() {
        @RequiresApi(Build.VERSION_CODES.O)
        override fun onLocationResult(locationResult: LocationResult) {

            val newLocation : Location = locationResult.lastLocation

            if(lastLocation != null){
                val distance = lastLocation?.distanceTo(newLocation)
                binding.distance.text = "${distance}m"
                
            }
            lastLocation = newLocation
        }
    }
  1. 누적 distance 구하기
  • 전역변수 선언 var total_distance : Float = 0.0F

  • 조건문 내부에서
    total_distance += distance

    ✅ 이동 시간 구하기

    ChatGPT에서는 정확한 이동 시간 거리 구하기 답변을 얻지 못해 블로그를 참고하여 이동 시간을 구하였습니다.

    참고사이트
    https://copycoding.tistory.com/38

  • 전체코드

 private val mLocationCallback = object : LocationCallback() {
        @RequiresApi(Build.VERSION_CODES.O)
        override fun onLocationResult(locationResult: LocationResult) {
            val newLocation : Location = locationResult.lastLocation
            val newTime  = newLocation.time

            if(lastLocation != null){
                val distance = lastLocation?.distanceTo(newLocation)
                val lastTime = lastLocation!!.time
                val time = (newTime-lastTime!!)/1000

                distance?.let{
                    total_distance  += distance
                }
                total_time += time

               /* // 변환
                var sec = total_time % 60
                var min = total_time / 60 % 60
                var hour = total_time/3600*/

                binding.distance.text = "${distance}m"
                binding.time.text = "${time}초"
                binding.totalDistance.text ="${total_distance}m"
                binding.totalTime.text = "${total_time}초"

            }
            lastLocation = newLocation
        }
    }
  1. Location클래스 내부 time()메소드 이용하기
  2. 이동 시간 = 현재 시간 - 이전시간
  • 현재 시간 :
    (앞서 구한 newLocation 이용)
    var currentTime = newLocation.time
  • 이전시간
    (앞서 구한 lastLocation 이용)
    var lastTime = lastTime!!.time
  1. 이동시간
    var time = currentTime - lastTime/1000 sec 표시
  2. 누적 이동 시간
  • 전역변수 var total_time : Long = 0
  • 조건문 내부에서
    total_time += time
  1. 시: 분 : 초 로 표시하기
    total_time은 sec으로 측정되므로 보기 편하게 시, 분, 초로 변환하는 작업 필요

실제 기기와 연결해서 이동해보며 이동거리와 이동 시간을 측정해보았다.

📌추가

이동하지 않을 때는 위치 정보 업데이트 하지 않기
➡️ 만보기앱이 실행될때 location update 받기

💡느낀점

Google Location Service 처음 이용해 보는데 이해하는데 시간이 조금 걸렸다. 마지막 위치를 받는 것은 간단했지만,
내가 구현하고자 하는 걷기 앱에 걸은 시간과 거리를 측정하려면 location update받아야 하는데 그 부분이 복잡했다. 이걸 해결하는데 2주이상 걸린 듯하다.

공식문서도 보고, 도 찾아보고, 구글링으로 블로그를 찾아보고, 유튜브에서 영상도 보고, ChatGPT 이용해서 질문도 해보고 다양한 시도를 해보았다.

  • 계속 보고 어떻게 활용되는지 파악해야 한다 아무리 유용한 정보더라도 내가 소화하지 못하면 소용이 없다. 그래서 익숙해질 때까지 사용해야 한다. 다양한 자료들을 수집하긴 했는데 내가 그것을 소화하기까지 아직은 많이 부족한 것 같다.

  • 이해해야 응용할 수 있다. 다른 사람의 코드나 샘플코드를 참고해서 내가 구현하고자 하는 것을 만들어야 하는 데, 이해하지 못한다면 응용이 안 된다. 아직 모든 코드를 다 이해했다고 할 순 없지만 그래도 하나씩 하나씩 구현해보자.

profile
곰곰

0개의 댓글