태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


LocationFactory.java


* 이번에는 Location Manager를 이용해서 현재 사용자의 위치를 측정하는 방법을 공부해보자.


2012/11/05 - [Android(안드로이드) 앱 개발 기초] Eclipse 개발환경 설정하기, Android SDK 설치하기

2012/11/07 - [Android(안드로이드) 앱 개발 기초] 안드로이드 프로젝트 생성하고 에뮬레이터로 앱 실행하기

2012/11/10 - [Android(안드로이드) 앱 개발 기초] 간단한 인터페이스 구현과 다른 Activity로 넘어가기

2012/11/21 - [Android(안드로이드) 앱 개발 기초] Activity 라이프사이클 공부

2012/11/24 - [Android(안드로이드) 앱 개발 응용] Google Map API로 지도 보여주기(MapView), Overlay Item 그려주기 예제



* Location 측정 방법

: 현재 안드로이드 상에서는 다양한 방법으로 사용자의 위치를 측정하고 있다. GPS는 가장 정확하지만 실외에서만 제대로 작동하고, 배터리 소모가 심각하고, 사용자가 원하는만큼 빠르게 위치를 계산하지 못한다. 또 다른 방법으로는 안드로이드의 네트워크 위치 프로바이더를 이용하는 것인데, 통신사의 cell tower와 와이파이 신호의 위치를 통해서 실내와 실외 모두에서 측정가능한 방법인데다 응답고 빠르고 베터리 소모가 심하지 않지만, 정확성이 조금 떨어지는 단점이 있다. 따라서 사용자의 위치를 구할 때에는 GPS를 사용하거나 네트워크 위치 플바이더를 사용하거나 둘다 사용할수도 있다.


* 사용자 위치 측정의 어려움

: 모바일 단말에서 사용자의 위치를 측정하는 것은 다소 어려운 문제가 될수도 있다. 워낙에 다양한 상황으로 인해 위치의 측정에 오류가 발생하는 것이 빈번하기 때문이다. 다음의 사항들이 위치 측정에 있어서 어려운 점들이다.

    • 다양한 위치 정보 소스: GPS와 cell-ID 그리고 Wi-Fi를 이용해서 사용자의 위치를 측정한다고 치면 어느것을 사용해야할지 정확성, 속도, 배터리 소모의 관점에서 선택을 하는 것이 중요하다.
    • 사용자의 움직임: 사용자의 위치가 계속 변화되기 때문에, 사용자의 움직임을 이용해서 사용자의 위치를 추정해야하는 경우가 빈번하게 발생한다.
    • 정확성: 각 위치 정보 소스로부터 오는 정보를 기반으로 하는 위치 측정은 항상 일정한 정확성을 유지하고 있지 않다. 10초전에 측정한 위치가 최근에 측정한 위치보다 더 정확한 위치를 표시하고 있을지도 모른다.

: 이러한 어려움들이 신뢰성있는 사용자의 위치 측정을 어렵게 만들고 있고, 앱에 따라서 다양한 방법들을 통해 정확성과 응답성 등을 보장해야하는 방법을 잘 선택해야 할 것이다.


* 위치 정보 갱신 요청

: 위의 어려움들을 해결하기 전에 일단 안드로이드에서 위치를 가져오는 방법을 살펴보자. 사용자의 위치 정보를 가져오는 것은 콜백 형식으로 이루어진다. 위치 정보를 얻고자 LocationManager에게 requestLocationUpdates() 함수를 호출함으로써 요청을 하게 되고, LocationListener를 인자로 넘겨줘서 콜백 함수로서 사용하게 된다. LocationListener 함수는 몇개의 콜백 함수들을 구현해야할 것이고, LocationManager에서는 사용자의 위치 정보가 변경되었을 때 이 콜백 함수들을 호출하게 된다.


: 예를 들면 다음의 코드에서 LocationListener를 어떻게 정의하고 위치 정보를 요청하는지 알수 있을 것이다.

        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        
        LocationListener locationListener = new LocationListener() {
			@Override
			public void onStatusChanged(String provider, int status, Bundle extras) {
			}
			
			@Override
			public void onProviderEnabled(String provider) {
			}
			
			@Override
			public void onProviderDisabled(String provider) {
			}
			
			@Override
			public void onLocationChanged(Location location) {
				Log.d("Location", location.toString());
			}
		};
		
		locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);


: 여기서 requestLocationUpdates의 첫번째 인자는 위치 프로바이더의 종류로 LocationManager.NETWORK_PROVIDER인 경우는 cell tower와 WiFi를 기반으로 사용자의 위치를 측정하게 된다. 두번째 인자는 위치 정보를 다음에 다시 가져오기 위한 최소의 시간을 나타내고, 세번째는 위치 정보를 다시 가져오기 위한 최소의 거리차를 입력하면 된다. 둘다 0으로 입력한다면 정보 업데이트가 가능할때마다 위치 정보를 업데이트 하겠다는 것이다. 마지막 인자는 위에서 작성한 LocationListener를 인자로 넘겨주면 된다.


: GPS를 이용해서 정보를 받고자 한다면 첫번째 인자의 NETWORK_PROVIDER를 GPS_PROVIDER로 바꿔주면 된다. 둘다 사용하고자 한다면 requestLocationUpdates를 한번은 NETWORK_PROVIDER로, 한번은 GPS_PROVIDER로 각각 호출하면 둘다 이용하게 된다.


* 위치 정보 프로바이더를 이용하기 위한 권한 부여

: NETWORK_PROVIDER와 GPS_PROVIDER로부터 정보를 받기 위해서는 ACCESS_COARSE_LOCATION이다 ACCESS_FINE_LOCATION 사용을 허용해줘야한다. AndroidManifest.xml 파일에서 <manifest> 태그 안에다가 사용 permission을 추가해주자.

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

: 위의 사용 허가는 ACCESS_FINE_LOCATION은 NETWORK_PROVIDER와 GPS_PROVIDER 둘다 이용할 수있도록 허가하는 것이고, ACCESS_COARSE_LOCATION은 NETWORK_PROVIDER만을 허용하도록 하는 설정이다.


: 이렇게 설정하면 위치 정보를 가져오는 것은 끝난 것이다. 한번 테스트를 해보면 에뮬레이터상이라 위치 정보를 가져오지 않고 있는 것을 알 수 있을 것이다. 안드로이드 폰을 디버그모드로 놓고 폰에서 직접 돌린다면 쉽게 테스트가 가능하겠지만 에뮬레이터상에서는 어쩔수 없이 직접 위치 정보를 보내야한다. 그럴려면 Eclipse상의 DDMS 화면을 열어야한다.


* 에뮬레이터로 위치 정보 시뮬레이션하기

: 일단 앱을 실행한 상태에서 Window > Open Perspective > Other... 를 하거나 오른쪽 위에 JAVA, 또는 JAVA EE 등과 같은 탭 왼쪽에 + 표시가 있는 창포양의 아이콘을 클릭하면 아래와 같이 여러 가지 화면 설정이 나오는데 DDMS를 선택한다.



: 그럼 아래와 같이 에뮬레이터를 여러 가지로 디버그, 또는 컨트롤할 수 있는 화면이 나오는데 우측 상단의 Emulator Controls을 누르면 아래쪽에 Location Controls가 있다.



: 컴퓨터에 붙어있는 GPS에서 자동으로 잡아줬는지는 몰라도 값이 자동으로 들어가있다. 값이 들어가 있지 않다면 적당한 값을 입력하고 "Send" 버튼을 누르자. Send 버튼을 누르면 requestLocationUpdates 함수가 갱신이 되어 설정해놓은 LocationListener의 콜백 함수가 호출이 될 것이다.



: 그 결과 위와 같이 Location이 출력되는 것을 볼 수 있다. 이렇게 하면 사용자의 위치를 알 수 있게 된다. 하지만 여기까지만 한다면 그것은 사용자를 생각하는 앱이 아니게 될 것이다. 왜냐하면 위에서 언급했던 여러 가지 어려움들에 대한 고민을 전혀 안했기 때문에 사용자를 위해 한번 쯤 다양한 고민들을 할 필요가 있을 것이다.


* 위치 정보 접근을 위한 최적화 모델

: 이제 사용자의 위치를 이용하는것은 어플리케이션의 기본적인 기능이 되었음에도 위의 어려움들을 고려하는 앱들은 많지 않다. 이렇게 GPS의 정확성과 NETWORK의 배터리 소모를 효율적으로 조합을 하는 모델을 정의해놔야 사용자의 위치를 이용하는 어플리케이션으로서 위치 성능을 최적화 했다고 할 수 있을 것이다.


: 모델의 기본적인 흐름은 다음과 같다.

    • 앱을 시작한다.
    • 위치 프로바이더들로부터 사용자의 위치 정보를 listen하기 시작한다.
    • 사용자의 위치를 추정하여 다양한 소스로부터 들어온 정보를 정확한 것을 보유하고 필터링해준다.
    • 위치 프로바이더로부터 listen을 중지한다.
    • 최근의 추정한 위치를 사용한다.

: 위의 모델을 간단한 예로 나타내면 아래와 같다.


앱 시작 -> GPS와 Network 위치 프로바이더 listen -> Cache 해둔 위치 정보 사용 -> Cell-ID 기반의 위치 정보 갱신(Cache 위치 폐기) -> WiFi 기반의 위치 갱신(Cell-ID 기반의 위치 폐기) -> GPS 위치 갱신(WiFi 기반의 위치 폐기) -> GPS와 Network 위치 프로바이더 listen 중지 -> GPS 위치 정보 Cache


: 이 모델의 특징은 최근에 받아온 정보를 이용하면서, 가장 정확한 위치 정보 데이터를 최대한 유지하고 계속 새롭게 갱신해나간다는 것이다. 그리고 계속 위치 정보를 받아오는 것이 아니라 listen하는 것을 잠시 중지 시킴으로써 배터리 소모 문제를 해결하고자 한 것이다. 이러한 모델을 사용하고자 한다면 앱의 특성에 따라 다양한 결정들을 해야할 것이다.


* 언제 listen을 시작할 것인가

: 위치 정보의 갱신은 앱을 시작하자마자 사용자 위치를 가져오거나 사용자가 특정한 기능을 실행했을 때 시작하는 것이 좋다. 하지만 지속적인 위치 정보의 갱신은 배터리 소모의 주된 원인이므로 조심해야하지만, 짧은 위치 정보의 갱신은 정확성이 떨어지므로 trade-off를 잘 계산해야한다. 위의 예제에서 이용한 것과 같이 아래와 같이 위치 정보를 listen할 수 있다.

LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
// 또는 GPS 데이터를 이용하고자 한다면..
// LocationProvider locationProvider = LocationManager.GPS_PROVIDER;

locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);


* 이전에 수집했던 위치 이용하기

: 때로는 위치 listener가 위치를 가져올 때까지 너무 긴 시간이 걸릴지도 모른다. 그럴 대에는 기존에 수집했던, 캐쉬되어있던 위치를 가져와서 사용하면 대략적인 기능을 이용할 수 있을 것이다. 이 경우 LocationManager의 getLastKnownLocation(String) 함수를 이용하면 된다. 아래와 같이 이용할 수 있다.

LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
// 또는 GPS 데이터를 이용하고자 한다면..
// LocationProvider locationProvider = LocationManager.GPS_PROVIDER;

Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);


* 언제 listen을 멈출 것인가

: 언제 시작하느냐보다 중요한 것은 위치의 수집을 언제 멈출 것인가이다. 왜냐하면 오랫동안 위치 정보를 한다면, 엄청난 배터리 소모를 감수해야할 것이기 때문이다. 많은 지도를 이용하는 앱들이 수집하는 기능에만 초점을 맞춰서 배터리 소모를 고려하지 않고 있겠지만, 이것을 고민해야하는 것은 지도 관련 앱을 개발하는데 있어서 가장 기본이다. 언제 멈출것인가를 결정하는 것은 다양한 방법이 있다. 현재 측정한 값이 정확한 값이라고 여겨진다면 멈춘다던가, 사용자가 움직이지 않으면 멈춘다던가, 앱의 기능과 특징에 따라 잘 결정해야할 것이다. 위치 정보의 listen은 아래와 같이 멈출 수 있다.

locationManager.removeUpdates(locationListener);



* 가장 정확성이 높은 위치 값 보유하기

: 일반적으로는 간단하게 가장 최근에 수집된 위치 값이 가장 정확성이 높다고 짐작할 수 있을 것이다. 하지만 실제로는 정확성이 그때그때 달라지기 때문에 몇가지 기준에 의하여 위치의 정확성을 측정하여 가장 정확할 값을 계속 유지하고 사용해야할 것이다. 아래는 정확성을 판단할 수 있는 몇개의 기준이다.


    • 기존에 수집된 값보다 일정 시간 이후의 최신 데이터 값인지 체크
    • 기존에 수집된 값보다 정확성이 더 좋은지 나쁜지 체크
    • 새로 들어온 위치 프로바이더가 더 신뢰할 수 있는지 체크

: 다양한 기준들이 있겠지만, 가장 쉽게 생각할 수 있는 위와 같은 기준으로 정확성 높은 값을 유지하는 함수를 짠다면 다음과 같이 짤 수 있을 것이다.

private static final int TWO_MINUTES = 1000 * 60 * 2;

/** 기존의 위치와 비교하여 더 좋은지 여부를 판단하고 위치 정보를 갱신하면 될 것이다
  * @param location  기존의 위치와 비교할 새로운 위치정보
  * @param currentBestLocation  현재 보유하고 있는 위치 정보
  */
protected boolean isBetterLocation(Location location, Location currentBestLocation) {
    if (currentBestLocation == null) {
        // 기존의 위치 정보가 없다면 새로운게 좋은것이다.
        return true;
    }

    // 새로 들어온 위치 정보가 최근 것인지 아닌지 여부를 구분
    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
    boolean isNewer = timeDelta > 0;

    // 2분을 지났다면 새로운 위치 정보가 더 좋은 것이다.
    if (isSignificantlyNewer) {
        return true;
    // 만약 새로들어온 위치 정보가 2분이전의 정보라면 안 좋은 것이다.
    } else if (isSignificantlyOlder) {
        return false;
    }

    // 정확성을 가져와서 비교
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // 위치 정보 프로바이더의 종류가 같은가?
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
            currentBestLocation.getProvider());

    // 정확성과 시간을 조합하여 품질을 결정
    if (isMoreAccurate) {
        return true;
    } else if (isNewer && !isLessAccurate) {
        return true;
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
        return true;
    }
    return false;
}

/** 두개의 위치 프로바이더가 같은지 비교하는 함수 */
private boolean isSameProvider(String provider1, String provider2) {
    if (provider1 == null) {
      return provider2 == null;
    }
    return provider1.equals(provider2);
}


* 데이터 정확성과 배터리 소모 조절하기

: 데이터 정확성과 배터리 소모는 서로 트레이드 오프가 이루어지기 때문에 적절한 선에서 정확성과 배터리 소모를 잘 고려해야할 것이다. 정확성이 어느정도 나왔다면, 대신 배터리 소모를 줄일 수 있는 몇 가지 방법들이 있다.

    • 위치를 listen하는 시간을 조절: 위치를 더 적은 시간동안 수집하게 된다면 위에서 더 좋은 위치 값을 선정할 때 들어오는 위치값들이 줄어들게 되므로 정확성은 조금 떨어지겠지만 배터리 소모는 아낄 수 있을 것이다.
    • 위치 프로바이더들이 위치를 업데이트하는 주기를 조절: 위치를 listen하는 중에도 수집되는 rate을 조절하면 배터리 소모를 줄일 수 있지만 정확성이 조금 떨어질 수 있을 것이다. 앱에서 얼마나 위치가 중요한가에 따라 조절을 하면 좋을 것이다. 업데이트 주기는 requestLocationUpdates의 최소 주기와 위치를 수집하게될 변환 거리를 설정함으로써 간단하게 조절할 수 있다.
    • 사용하는 위치 프로바이더를 조절: 구현하는 앱이 어디서 자주 이용되는가, 얼마나 높은 정확성을 요구하는가 등에 따라 네트워크 프로바이더나 GPS 프로바이더 중 하나만 선택하거나 정확성이 필요하다면 둘다 선택할 수 있을 것이다. 하나만 선택한다면 역시 배터리 소모가 줄어들겠지만 정확성이 조금 떨어질지도 모른다.


* 어디에 이런 위치 정보를 사용할까?

: 이러한 위치 정보의 활용은 다양한 앱에서 할 수 있을 것이다. 일반적으로 가장 많이 사용되는 것은 컨텐츠와 결합하여 더욱 창의적이고 유용한 컨첸츠로 활용될 때에 위치 정보가 많이 이용된다. 이럴 때에는 위의 listen을 언제 시작할 지 간단한 예를 만들 수 있을 것이다.

    • 1) 앱 시작
    • 2) 사용자가 컨텐츠 입력 시작
    • 3) 사용자가 입력을 저장

: 이러한 순서로 앱이 진행된다고 치자. 여기에 위치 정보도 같이 제공하는 서비스를 제공하고 싶다면, 2)번부터 위치 정보를 listen하다가 3번에 저정하기 전에 멈추고 사용자에게 위치 정보를 제공해주는 것이 배터리 소모와 정확성을 동시에 가져갈 수 있는 선택이 될 것이다. 사용자가 저장하기 전까지는 지속적으로 들어오는 새로운 위치 정보들을 정제하고 더 정확한 위치 정보를 취득하면 되는 것이다.


 흐름

------  1 ----->

----- 2 ----->

----- 3 ----->

----- 4 ----->

 앱 동작

앱 시작 

사용자가 컨텐츠 입력 시작 

사용자가 입력 중 

사용자가 입력을 저장 

 위치 정보

 -

위치 정보 listen 시작 

정확한 위치 정보 도착

위치 정보 listen 중지 


: 두번째 사용처는 사용자가 어디로 갈 것인지 알려줄 수 있는 역할일 것이다. 예를 들면 사용자의 위치 근처에 가까운 식당들을 추천해주는 앱을 제공해 준다고 할 때 이용하면 된다. 그럼 다시 위처럼 사용자의 앱 사용 흐름을 고민해보면 다음과 같을 것이다.

    • 이전의 위치 정보보다 정확한 위치 정보가 들어오게 되면 추천 정보를 다시 정렬
    • 추천 정보가 안정화 되면 listen을 중지


 흐름

------  1 ----->

----- 2 ----->

----- 3 ----->

----- 4 ----->

 앱 동작

앱 시작 

사용자가 추천 목록 접근 

추천 목록 갱신 

추천 목록 안전화 

 위치 정보

 -

위치 정보 listen 시작 

정확한 위치 정보 도착

위치 정보 listen 중지 


: 이런식으로 위치 정보를 이용한다면 앱에서 사용자가 위치 정보가 필요할 때의 시나리오를 잘 작성하여 언제 얼마나 측정을 할 것인지 계획을 잘 세워야 사용자에게 맞는 앱을 개발 할 수 있을 것이다.


끝.


- 다음 글

2012/12/05 - [Android(안드로이드) 앱 개발 기초] 런타임 설정(로테이션, orientation) 변환 라이프사이클

2012/12/19 - [Android(안드로이드) 앱 개발 응용] 쉽게 Google Map 위에 말풍선 띄우기

2013/03/03 - [Android(안드로이드) 앱 개발 기초] Fragment 기초

2014/09/24 - [Android(안드로이드) 앱 개발 기초] ContentProvider 앱 간 데이터 공유 기본

2014/10/20 - [Android(안드로이드) 앱 개발 기초] MediaPlayer 음악 재생하기



Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in theCreative Commons 2.5 Attribution License.

참고: http://developer.android.com/training/location/index.html

이 글을 공유하세요.

  • 이전 댓글 더보기
  • 2013.04.24 21:49  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Unikys 2013.04.25 09:07 신고  댓글주소  수정/삭제

      사실 GPS 신호가 잡히고 안잡히고 보다는 2개다 이용해서 수집을 하다가 getAccuracy를 기반으로 하는 것이 좋을겁니다. GPS 신호 자체는 안드로이드 개발자 사이트에서 GpsStatus, GpsSatelite를 찾아보시면 노이즈를 얻어올수는 있는데 이것을 기반으로 규칙을 만들어서 GPs냐 NETWORK냐를 선택할수도 있지만, 이 값들은 정확도와 항상 일치하지는 않으니 주의하셔야합니다.

  • 2013.04.24 22:25  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Unikys 2013.04.25 09:01 신고  댓글주소  수정/삭제

      네 그것과 관련된 소스는 다 지우셔야합니다. 제 프로젝트에서 위치 기반으로 짠 부분을 따온거라 그거는 제 프로젝트에 의존적인 소스입니다. 그 부분은 다 지우셔야합니다.

  • 2013.04.25 16:57  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Unikys 2013.04.27 15:23 신고  댓글주소  수정/삭제

      네 안드로이드를 개발하기 전에 자바에 대한 중급의 지식은 있어야 수월할겁니다. 자바에 대해서도 같이 공부하실 것을 권합니다~

  • 2013.04.30 08:16  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 2013.05.01 10:37  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 2013.05.01 19:53  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Unikys 2013.05.02 09:17 신고  댓글주소  수정/삭제

      해당 파일의 문제가 아니라 다른 문제입니다. exception이 일어난 것을 읽어보고 그대로 해석하시면 됩니다. 자바는 모든 오류의 정보가 exception의 stack에 다 들어있습니다. 모든 것을 직접 하나하나 짜는 것이 아니라면 일단 자바의 기초적인 공부를 일단 하시고 다른 라이브러리와 소스들을 쓰실 것을 권합니다.

      에러는 com.example.gpss.MainActivity 클래스를 찾을 수 없다는 겁니다. 패키지와 디렉토리 구조가 맞는지 com.example.gpss로 되어있는데 오타인지 확인해보시면 될 것 같고, 그래도 해결 안되면 Manifest.xml에서 Activity가 제대로 설정되었는지 확인해보세요. 그리고 직접 짜신게 아닌 소스는 카피앤 페이스트로 가져다 쓰기보다는 소스를 보시고 한단계씩 이해해가면서 쓰시는게 진행도 빠르고 공부도 되시면서 본인의 소스를 이해할 수 있어서 좋을 겁니다. 이것저것 그냥 가져다 쓰면 에러가 나도 왜 났는지 알수 없으니까요. 직접 이해하면서 쓰라는 의미에서 이 블로그 글을 이렇게 한단계씩 정리해서 쓴거고요.

      그리고 다른 어떠한 Activity에서도 호출하여 사용할 수 있도록 모듈화 시켜놓은겁니다. 지금 보니까 LocationFactory에 extend Activity를 추가하셨는데 extend Activity를 없애셔도 됩니다. 이렇게 구현하면 굳이 특정 Activity가 아니더라도 어느 위치에서든 위의 함수를 사용할 수 있도록 만든겁니다. 이 부분은 자바 초보자인 경우 이해하기 힘든 부분이라 위에 제가 짠 부분과 연동하는 부분까지 봐드리고 넣어드리려고 프로젝트의 소스를 보내달라고 한건데 LocationFactory.java 하나 밖에 안 보내주셔서 그 부분을 봐드릴수가 없네요. 아무튼 메일에 쓴 소스를 다른 Activity라면 어떠한 위치에서든 사용하시면 됩니다.

  • 조한동 2013.05.06 11:44  댓글주소  수정/삭제  댓글쓰기

    덕분에 많은 도움이 되었습니다.
    한가지 궁금한게 있어서 뎃글 남겨봅니다.

    지금 서버로 GPS정보를 전송하는 어플을 만들고 있는데 어플을 실행시키면 백그라운드에서 자동으로 GPS를 실행시키는 부분을 찾지 못해서 해매고 있습니다.

    String context = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) getSystemService(context);
    if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    alertCheckGPS();
    }

    이런식으로 GPS를 상태체크하여 작동중이면 pass, 작동하지 않으면 시스템설정에 들어가서 바꾸는 구조로 되어있는데 이것을 사용자가 건들이지 않고 자동으로 작동하게 하고싶네요.

    • Unikys 2013.05.06 13:27 신고  댓글주소  수정/삭제

      사용자가 어플을 처음 실행할 때에 한번은 위치 정보 수집에 동의를 해야하고요, 이후에는 Activity의 onResume 에 GPS를 활성화시키도록 넣으면 사용자 입력 없이 자동으로 수집 됩니다.

  • 이교나 2013.05.15 02:06  댓글주소  수정/삭제  댓글쓰기

    궁금한게있습니다.
    private static final int TWO_MINUTES = 1000 * 60 * 2;
    이건뭔가요??

    • Unikys 2013.05.16 10:03 신고  댓글주소  수정/삭제

      15/16번째줄에 보시면 해당하는 시간(여기서는 1000(ms) * 60(sec) * 2(min) = 2분)만큼 이전에 위치가 수집되었었다면, 새로운 위치로 업데이트한다는 겁니다.

  • =_= 2013.08.16 21:13  댓글주소  수정/삭제  댓글쓰기

    사용자 입장에서 NETWORK_PROVIDER 위치를 임의로 바꿀 수는 없나요?
    epenpal이란 어플이 wifi를 통해 사용자 위치를 잡는 것 같은데(WPS 방식?) 다른 위치로 임의로 바꾸려고 여러 방법을 찾아보다 여기까지 오게되었네요. ;;

    • Unikys 2013.10.31 13:35 신고  댓글주소  수정/삭제

      와이파이에다가 모바일 네트워크의 강도를 통해서 위치를 잡는게 NETWORK_ PROVIDER죠. 기본적으로 지원해주고 있는 기능인데, 더 세부적으로 하려면 자체적인 위치에 따른 wifi 강도에 대한 DB를 구축해야 할텐데 이미 구글이 어느정도 해주고 있으니 굳이 개발자들이 더 할 필요는 없다 생각합니다

  • 이경우 2013.10.29 18:09  댓글주소  수정/삭제  댓글쓰기

    잘읽었습니다~~ gps할때마다 배터리문제를 걱정했었는데 도움이 되었네요, 감사합니다~

  • 이송아 2013.11.20 16:03  댓글주소  수정/삭제  댓글쓰기

    이야.. 이때까지 제가 보았던 GPS 받아오는 어떤 글과도 비교할 수 없는 좋은 글입니다. 정확도체크까지. 진짜 짱!! 감사해요^^
    정확도 체크도 제가 적용해서 해봐야겠네요. 정말 도움 많이 되었습니다.

    • Unikys 2013.11.26 10:18 신고  댓글주소  수정/삭제

      안드로이드 메뉴얼을 기반으로 썼으니까요 ㅎㅎ 메뉴얼보다 뛰어난 글은 없습니다!
      정확도 같은 경우에는 약간 heuristic하게 구하는 것이라 100% 신뢰는 할 수 없지만 그래도 유용하게 활용할 수 있는 값이긴 합니다^^

  • 고정훈 2014.04.27 12:03  댓글주소  수정/삭제  댓글쓰기

    정말 잘 읽었습니다.
    다른 GPS 관련 블로그와는 달리 집중도도 높고 설명도 잘되있어서 푹 빠져 읽었습니다.
    이 블로그만큼은 소스가 먼저 눈에 들어오지 않네요. 정말 감사하게 잘 읽었습니다.
    주소 메모 해뒀다가 참고 하겠습니다^^..

    • Unikys 2014.05.03 20:03 신고  댓글주소  수정/삭제

      안드로이드는 매뉴얼이 잘 되어있기 때문이죠! ㅋㅋ 저도 소스보다는 원리를 중요하게 생각하다보니 이렇게 정리하는 것이 좋더라고요.

  • JH 2014.06.03 22:01  댓글주소  수정/삭제  댓글쓰기

    저 xml 소스도 알려주실 수 있나요...

  • 2014.09.10 14:52  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 솨솹 2014.12.12 21:29  댓글주소  수정/삭제  댓글쓰기

    안녕하세요! 저는 수업때문에 어플개발을 해야해서 처음 이클립스를 써보게 되었어요! 강의가 많은 도움이 되고 있습니당!! 근데 저희 어플에서 GPS를 받아와야해서 이 글의 소스를 참조하게 되었는데용 AndroidMeniFest.xml이 없다고 오류가 떠요!ㅠㅠ 어떻게 해야하나요??ㅠㅠ

    • Unikys 2015.01.02 13:14 신고  댓글주소  수정/삭제

      이클립스 상에서 안드로이드 앱 프로젝트가 정상적으로 생성이 된 것 같지 않네요. 아니면 기본으로 생성되는 AndroidManifest.xxml을 삭제 하셨을수도 있습니다.

  • 예쁜꽃이피었으면 2015.01.08 11:13 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    지금 앱에 gps설정 부분을 만들고 있습니다
    많은 도움이 될 것같은 좋은 글 써주셔서 감사드립니다.
    비공개로 제 블로그에 담아가겠습니다.

  • 보다못해글남깁니다 2015.02.20 22:55  댓글주소  수정/삭제  댓글쓰기

    아 진짜 너무하시네요!!
    전에 자바스크립트 클로져 개념 익힐때도 신세 많이졌는데, 안드로이드 만지면서도 도움 많이 받습니다. ^^
    개념 정확히 잡으면서 디테일까지 잡기가 쉽지 않은 일인데, 글을 정말 잘 쓰시는것 같습니다.
    좋은글 감사히 잘 읽었습니다.

  • 박경묵 2017.01.02 21:10  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    지금 위치기반에 대한 어플리케이션을 만드려고 하는 학생인데요...
    현재 위치말고, 다른 상대방의 위치를 어떻게 공유하는지 개념이 안 잡혀서 글을 써봅니다.

    • Unikys 2017.01.09 09:43 신고  댓글주소  수정/삭제

      상대방의 위치는 결국 상대방이 직접 수집해서 서버를 통하든 P2P로 연결하든 서로 공유해야 합니다. 상대방의 위치를 다른 사람이 수집할 수는 없습니다.

  • 2017.11.02 21:03  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 낙균 ㅋㅋ 2017.12.22 05:54  댓글주소  수정/삭제  댓글쓰기

    ㅎㅎㅎ 저는 프로그래밍이 이해하기 어려워서 ㅠㅠ 헉시 위치기반 서비스, 프로그래밍 하지 않고 그냥 쉽게 만드는 프로그램 같은 것은 없나요? ㅎㅎ

질문이나 의견을 댓글로 달아 주세요