프로그래밍/Android2011. 8. 25. 14:04
위치 정보 - LocationManager

 위치 정보를 얻으려면, 위치 정보를 담당하고 있는 LocationManager의 인스턴스가 필요합니다. LocationManeger의 인스턴스는 다음과 같이 받을 수 있습니다.


위치 확인 - 위치 프로바이더 선택하기

 LocationManager는 위치 정보를 받을 수 있도록 도와주는 역할만 하고, 실제 위치정보는 위치 프로바이더(Location Provider)를 통해 얻습니다. LocationManager와 위치 프로바이더를 통해 위치 정보를 얻는 과정은 다음과 같습니다.

위치 정보를 받는 과정


 위치 프로바이더는 크게 GPS 신호를 통해 위치를 알려주는 GPS 프로바이더(LocationManager, GPS_PROVIDER)와 Wi-Fi 네트워크나 통신사의 기지국 정보를 통해 위치를 알려준느 네트워크 프로바이더(LocationManager.NETWORK_PROVIDER)가 있습니다.
 위치 프로바이더를 얻는 방법은 다음과 같습니다.

 1. 직접 프로바이더를 선택하는 방법
 2. 조건을 지정하고, 상황에 따라 최적의 프로바이더를 선택하는 방법

 직접 프로바이더를 선택하려면 LocationManager.getProvider() 메서드를 사용하면 됩니다.
public LocationProvider getProvider (String name)

인자로 받은 위치 프로바이더를 반환합니다.


 getProvider() 메서드에서 반환하는 프로바이더의 종류와 특성은 다음과 같습니다.
LocationManager.GPS_PROVIDER

GPS 위성 신호를 통해 위치 정보를 제공합니다. ACCESS_FINE_LOCATION(android.permission.ACCESS_FINE_LOCATION) 권한이 필요합니다.


LocationManager.NETWORK_PROVIDER

네트워크 정보(Wi-Fi, 기지국 정보)를 이용하여 위치 정보를 제공합니다. Wi-Fi를 통한 위치 확인은 ACCESS_FINE_LOCATION(android.permission.ACCESS_FINE.LOCATION), 기지국 정보를 이용한 위치 확인은 ACCESS_COARSE_LOCATION(android.permission, ACCESS_COARSE_LOCATION) 권한이 필요합니다.



내가 원하는 조건대로

직접 프로바이더를 선택하지 않고, 일정한 조건과 상황에 따라 가장 적절한 프로바이더를 선택하려면 Criteria(android.location.Criteria) 클래스를 사용합니다.
Criteria 클래스는 위치 정보를 받을 때 고려할 조건들을 지정하여 최적의 위치 프로바이더를 선택할 수 있도록 합니다. Criteria 클래스에서 지정할 수 있는 조건들은 다음과 같습니다.

- 전원 사용량(Power Requirement)
- 정확도(Accuracy)
- 방위각 정보(Bearung) 유/무
- 속도 정보(Speed) 유/무
- 고도 정보(Altitude) 유/무
- 추가 비용(Cost) 유/무

 Criteria 객체의 기본값은 정확도, 전원 사용량, 방위각 정보, 속도 정보, 고도 정보는 상관하지 않고, 추가 비용은 청구되지 않는 조건입니다.
 조건을 지정하려면, Criteria 클래스 내의 조건 지정 메서드를 사용하면 됩니다. 조건을 지정하는 메서드는 다음과 같습니다.
public void setPowerRequirement (int level)

전원 소모량을 설정합니다. POWER_HIGH, POWER_MEDIUM, POWER_LOW 중 하나를 선택합니다.


public void setAccuracy (int accuracy)

정확도를 설정합니다. ACCURACY_FINE, ACCURACY_COARSE 중 하나를 선택합니다.


public boolean isBearingRequired ()

방위각 정보가 필요한지 여부를 설정합니다.


public boolean isSpeedRequired ()

속도 정보가 필요한지 여부를 설정합니다.


public boolean isAltitudeRequired ()

고도 정보가 필요한지 여부를 설정합니다.


public boolean isCostAllowed ()

추가 요금이 부가되어도 되는지 여부를 설정합니다.


 다음은, 전원은 가급적 적게 소모하고 정확도는 다소 낮아도 되는 조건을 가지는 Criteria 객체를 생성하는 예입니다.

 위치 정보를 얻기 위한 조건을 지정한 후에는 다음의 두 메서드를 사용하여 조건에 맞는 위치 프로바이더를 받을 수 있습니다.
public List<String> getProvides (Criteria criteria, boolean enabledOnly)

조건에 해당하는 위치 프로바이더의 목록을 반환합니다. enabledOnly에 true를 넣어주면 현재 사용 가능한 위치 프로바이더만 반환합니다.


public String getBestProvider (Criteria criteria, boolean enabledOnly)

조건에 가장 잘 부합하는 위치 프로바이더를 반환합니다. 조건에 부합하는 프로바이더가 여러 개라면 가장 정확도가 높은 프로바이더를 반환하며, 조건에 부합하는 프로바이더가 없을 경우 다음 순서대로 조건을 하나씩 완화시켜 프로바이더를 검색합니다.
 
  - 전원 사용량(Power requirement)
  - 정확도(Accuracy)
  - 방위각 정보(Bearing) 유/무
  - 속도 정보(Speed) 유/무
  - 고도 정보(Altitude) 유/무

Criteria의 조건 중 추가 비용 유/무 조건은 완화되지 않으며, 추가 비용 조건을 제외한 모든 기준을 완화했음에도 불구하고 조건에 부합하는 프로바이더를 찾지 못했다면 null을 반환합니다.



확인된 위치 조회하기

마지막으로 확인된 위치는 위치 프로바이더마다 각각 다를 수 있습니다. 마지막으로 확인된 위치를 조회할 때는 신호 수신이나 데이터 접속이 필요없으므로, 빠른 시간 안에 위치 정보를 확인할 수 있습니다.
 마지막으로 확인된 위치를 받아오는 메서드는 다음과 같습니다.
public Location getLastKnownLocation (String provider)

인자로 선택한 프로바이더의 마지막으로 확인된 위치를 반환합니다.


 
다음 코드는 GPS 프로바이더에서 마지막으로 확인된 위치의 정보를 받아오는 예입니다.


현재 위치 알아내기

현재 위치를 알려면 위치 정보를 받기 위해 선택한 프로바이더에 위치 업데이트를 요청해야 합니다. 위치 업데이트를 요청하기 위해 LocationManager 클래스의 requestLocationUpdates() 메서드를 사용하며, 인자로 LocationListener를 넣어 위치 정보가 업데이트 되었을 때의 동작을 구현합니다.
 LocationListener의 모습은 다음과 같습니다.

 LocationListener를 구현한 후에는, requestLocationUpdates() 메서드를 사용하여 위치 정보를 전달받습니다. requestLocationUpdates() 메서드의 모습은 다음과 같습니다.
public void requestLocatioonUpdates (String provider, longminTime, float minDistance, LocationListener listrener)

선택된 프로바이더를 사용하여  위치 정보를 업데이트합니다.
- provider : 위치 프로바이더를 지정합니다.
- minTime : 위치 정보를 업데이트할 간격입니다. (단위는 밀리초) 상황에 따라 이곳에 입력한 주기보다 더 짧은 주리고, 혹은 더 긴 주기로 정보가 업데이트될 수 있습니다.
- minDistance : 위치 정보를 업데이트할 최소 거리 간격입니다.(단위는 미터)



위치 정보 수신 중지

위치 정보가 더 이상 필요 없다면, 위치 정보 업데이트를 중단하여 배터리 소모를 줄여야 합니다. 위치 정보 업데이트를 중단하는 메서드는 다음과 같습니다.
public void removeUpdates (LocationListener listener)

위치 정보 업데이트를 중단합니다.


 위치 정보를 얻는 과정부터 위치 정보 업데이트를 중단하는 과정입니다.

위치 정보를 사용하는 과정





근접 알림(Proximity Alert) 예제




출처 - 기초부터 다지는 커니의 안드로이드



Posted by 건깡