Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[51일차 Android] Location 본문

Computer/Android

[51일차 Android] Location

Wise-99 2023. 7. 20. 19:05

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Location

 

GPS : Global Positioning System

  • 단말기와 네트워크 망, 위성 등을 모두 연결해 현재 위치를 측정할 수 있는 시스템
  • 안드로이드는 단말기 내부에서 가용한 위치 측정 수단을 모두 동원해 위치를 측정하고 있다.
  • 애플리케이션에 측정된 위치 값을 가져다 사용할 수 있다.

 

 

 

Porovider

  • 안드로이드는 위치 측정을 위해 위치 정보 제공자를 선택해서 사용하며 가급적이면 모든 위치 정보 제공자를 사용하는 것이 좋다.
    • GPS Provider : GPS 위성과 통신하여 3각 측량 방법을 이용해 위치 정보를 습득한다. 위성과의 전파 송수신이 방해가 되는 요인(방해전파, 실내, 건물내, 계곡 등)이 있으면 정확한 위치를 측정할 수 없다.
    • Network Provider : 이동통신 기지국, Wifi ap 등 통신망을 통해 위치 측정
    • Passive Provider : 직접 위치를 측정하는 것이 아닌 다른 애플리케이션이 구한 값을 받아 사용하는 방식

 

 

 

Permission

  • Provider 별로 권한을 등록해야 한다.
    • GPS : ACCESS_FINE_LOCATION
    • Network : ACCESS_COARS_LOCATION 또는 ACCESS_FINE_LOCATION
    • Passive : ACCESS_FINE_LOCATION

 

 

 

예제 코드

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    // 권한 목록
    val permissionList = arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )

    // 위치 측정 리스너
    var locationListener:LocationListener? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)

        // 권한 확인
        requestPermissions(permissionList, 0)

        activityMainBinding.run {
            button.setOnClickListener {
                // 사용자의 권한 허용 여부 확인
                val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
                val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)

                // 권한을 모두 허용했다면
                if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED){
                    // 위치 정보를 관리하는 관리자 추출
                    val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager

                    // 마지막으로 저장된 위치 값을 가져온다.
                    val location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
                    val location2 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)

                    // 기존에 추출된 정보가 있다면 일단 이것으로 먼저 사용한다.
                    if(location1 != null){
                        showInfo(location1)

                    } else if(location2 != null) {
                        showInfo(location2)
                    }

                    // 위치 측정 리스너
                    locationListener = object: LocationListener{
                        // 위치가 새롭게 측정되면 호출되는 메서드
                        override fun onLocationChanged(p0: Location) {
                            showInfo(p0)
                        }
                    }

                    // GPS Provider가 사용 가능하다면 측정을 요청
                    if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) == true){
                        // 첫 번째 : 요청할 프로바이더
                        // 두 번째 : 측정할 시간 주기. 0을 넣어주면 가장 짧은 주기마다 측정을 한다. (단위 ms)
                        // 세 번째 : 측정할 거리 단위. 0을 넣어주면 가장 짧은 거리마다 측정을 한다. (단위 m)
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f){
                            showInfo(it!!)
                        }
                    }

                    // Network Provider가 사용 가능하다면 측정을 요청한다.
                    if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) == true){
                        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f){
                            showInfo(it!!)
                        }
                    }
                } else {
                    requestPermissions(permissionList, 0)
                }
            }

            // 위치 측정 중단
            button2.setOnClickListener {
                
                if(locationListener != null){
                    val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
                    locationManager.removeUpdates(locationListener!!)
                    locationListener = null
                }
            }
        }

        setContentView(activityMainBinding.root)
    }

    fun showInfo(location: Location){
        if(location != null){
            activityMainBinding.run{
                textView.text = "Provider : ${location.provider}"
                textView2.text = "위도 : ${location.latitude}"
                textView3.text = "경도 : ${location.longitude}"
            }
        }
    }
}

 

 

 

결과