ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Location Manager
    Android/LBS 2019. 7. 26. 16:06

    LBS는 Location Based Service의 약자다


    기본적인 모바일 디바이스에 위치를 흭득 할때에는 위, 경도를 사용해서 계산한다

    이러한 LBS 프로그래밍을 위한 라이브러리는 아래와 같다

     

    1. 표준 Library "Location Manager" ( 1 -> 28 ) System Service가 제공한다.
    2. Fused Location API
    3. Map

     

    딱 무엇을 선택해야 한다는 표준 라이브러리는 없다. 어떤 벤더의 지도를 사용할껀지 개발자가 선택 하여야 한다.

     

    위 경도 계산은 기본적으로 위/경도는 도/분/초/로 표시되는데 일반적인 시스템에서는 실수로 사용한다. 
    * 위도 : 90 ~ 0 ~ -90 ( 0 : 적도 ) 
    * 경도 : 180 ~ 0 ~ -180 ( 0 : 그리니치 천문대 ) 
    소숫점 6자리 이하의 데이터는 필요가 없다. 
    Creteria 를 이용하여서 정확도가 높은 걸 이용하여서 GPS Network 둘중 알맞은거를 판단하여서 출력을 한다.


    1. LocationManager


    LocationProvider에는 아래와 같은 종류가 있다.

    GPS Provider

    GPS 위성을 이용하여 위치 정보 흭득 

    오차 범위 : 10m ~ 15m 
    - 군사목적으로 이용하던 것을 민간으로 풀어서 GPS가 사용되었다. 
    - 최소한의 정확한 GPS 좌표는 3개의 위성이 필요 

    Network Provider

    이동통신사 망 정보를 이용하여 위치 정보 흭득 

    오차 범위 : 1km ~ 1.5km 
    - 대략적인 위치는 파악 가능하나 길 안내로는 사용이 불가능하다. 
    - 아직까지는 IPv4 체제 ( 디바이스가 연결 될때 마다 달라 진다. ) 

    Wifi Provider

    와이파이의 AP 정보를 이용하여 위치 정보 흭득 

    오차 범위 : 1m ~ 5m 
    - 우리나라에서는 제공되지 않는다. ( 남이 설치해놓은 와이파이를 수집해 가는것은 불법 ) 
    - Google Contents 
    - Beacon : Bluetooth 

    Passive Provider  다른 앱에서 이용한 마지막 위치 정보 흭득 

    위치 정보 제공자 정보 흭득은 아래와 같이 한다

    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    
    val providers = locationManager.allProviders
    // 스마트폰에서 제공하는 모든 위치 정보 제공자
    
    val enabledProviders = locationManager.getProviders(true)
    // 사용 가능한 위치 정보 제공자
    
    val location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
    // 위치 흭득 ( 펄미션 필요 )
    
    
    // android menifest
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    LocationListener

    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    
    val listener = object : LocationListener {
        override fun onLocationChanged(location: Location?) {
            "onLocationChanged".log()
        }
    
        override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
            "onStatusChanged".log()
        }
    
        override fun onProviderEnabled(provider: String?) {
            "onProviderEnabled".log()
        }
    
        override fun onProviderDisabled(provider: String?) {
            "onProviderDisabled".log()
        }
    }
    
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000L, 10.0F, listener)

    GPS를 사용하기 위해서는 Permission 권한이 필요합니다.

    마시멜로우 부터는 매니페스트에 올려 놓아도 한번더 받아야 하니..

    저는 TedPermission으로 구현하였습니다.

    D: onProviderDisabled
    D: onProviderEnabled
    D: onProviderDisabled
    D: onProviderEnabled

    GPS를 껐다가 켰다 하면 위와 같이 실행이 되고 제가 실내에서 테스트 해서 그렇지 외부에서 테스트 시 다른 리스너도 동작을 잘 할 것입니다.

    댓글

Designed by Tistory.