LocationManager를 사용하기 위한 퍼미션 : ACCESS_COARSE_LOCATION
or ACCESS_FINE_LOCATION
모바일의 Gps 또는 Network 정보로 위치좌표를 받아오는 방법에 대해 알아보겠다.
LocationManager mLM = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
이렇게 로케이션 매니저를 선언 한 뒤, 위치값 갱신을 호출 해 보자.
위치 제공자는 총 2가지 종류가 있다.
1. GPS_PROVIDER
2. NETWORK_PROVIDER
실내에서는 GPS_PROVIDER를 호출해도 응답이 없다. 응답을 기다리는 형태로 코딩을 했다면
별다른 처리를 하지 않으면 실내에서는 무한정 대기한다.
따라서 타이머를 설정하여 GPS_PROVIDER를 호출 한 뒤 일정 시간이 지나도 응답이 없을 경우
NETWORK_PROVIDER를 호출 하거나,
또는 둘 다 한꺼번에 호출하여 들어오는 값을 사용하는 방식으로 코딩을 하는것이 일반적이겠다.
private void registerLocationUpdates() {
mLM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
1000, 1, mLocationListener);
mLM.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 1, mLocationListener);
//1000은 1초마다, 1은 1미터마다 해당 값을 갱신한다는 뜻으로, 딜레이마다 호출하기도 하지만
//위치값을 판별하여 일정 미터단위 움직임이 발생 했을 때에도 리스너를 호출 할 수 있다.
}
private final LocationListener mLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
//여기서 위치값이 갱신되면 이벤트가 발생한다.
//값은 Location 형태로 리턴되며 좌표 출력 방법은 다음과 같다.
if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
//Gps 위치제공자에 의한 위치변화. 오차범위가 좁다.
double longitude = location.getLongitude(); //경도
double latitude = location.getLatitude(); //위도
float accuracy = location.getAccuracy(); //신뢰도
}
else {
//Network 위치제공자에 의한 위치변화
//Network 위치는 Gps에 비해 정확도가 많이 떨어진다.
}
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
위와같이 사용하면 된다. 그리고 더이상 위치값을 호출하지 않아도 되는 경우에는
mLM.removeUpdates(mLocationListener); 로 자원해제를 반드시 해 준다. 누락하면 딜레이마다 계속 호출한다.