2010. 4. 15. 18:10

Android Location & google maps 탐구 -1-





Android Location & google maps 탐구 -1부- 입니다. 3부 까지는 가지 않을까 합니다.
<본 게시물에 내용은 제 학습을 목적으로  정리한 글입니다. 그러므로  내용이 틀릴 가능성이 꾀 큽니다.>
<참고 문헌  wrox:Professional Android Application Development, Apress: Pro Android>

LocationManager : Provides hooks to the location-based services.라고 나와 있고 번역서에는 위치기반 서비스에 대한 고리를 제공한다........라고 그대로 번역 되어 있더군요..
설명 되로 LocationManager 은 위치기반 서비스의 '연결'고리 역활을 합니다.
LocationManager을 이용하여 위치를 나타내는 Location과 LocationProvider를 얻을 수 있지요.
아래 코드는 LocationManager를 얻는 코드 입니다.

LocationManager locationManager;
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

LocationProvider는 위치 정보 공급자이며 위치정보를 담고있는 Location을 얻기위해 필요 하지요
LocationProvider 얻는 방법은 ..

String provider = LocationManager.GSP_PROVIDER;//제공되는 공급자를 직접 명시하는...(없으면..?)

List<String> providers = locationManager.getProviders(true); //사용 가능한 모든 공급자를 얻음

그리고 Criteria클래스를 이용하여 이용가능한 공급자 중에서 가장 적당한 것을 고르는 방법이 있습니다.

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE); //정확도
criteria.setPowerRequirement(Criteria.POWER_LOW); //전원 소리량
criteria.setAltitudeRequired(false); // 고도, 높이 값을 얻어 올지를 결정 하는듯 합니다..;;
criteria.setBearingRequired(false);//뭘까요..
criteria.setSpeedRequired(false);//속도
criteria.setCostAllowed(true);//위치 정보를 얻어 오는데 들어가는 금전적 비용

위 코드에서 보이는 것처럼 Criteria를 설정 한 후 locationManager.getBestProvider()메소드에 인자로 넘기면... 조건에 맞는 공급자를 얻을 수 있습니다.

String bestProvider = locationManager.getBestProvider(criteria, true); //가장 좋은 하나의 공급자
List<String> matchingProviders = locationManager.getProviders(criteria,false);//조건에 맞는 모든 공급자
Criteria클래스에 정의된 조건들은 Cost에 대한 부분을 제외 하고는 해당 사항이 없을 경우 그 값을 사용자 몰래~낮추어 버립니다..

Criteria클래스의 설정 부분은 SharedPreferences클래스를 이용하여 저장 하면 좋을 듯 합니다.
(혹시 ...PreferencesActivity에 관한 정보 있으신분....지식 좀 나누워 주세요 ㅠㅠ)

이제 LocationManager와 LocationProvider까지 얻었으니 이제 Location 클래스를 얻을 차례입니다.

Location location = locationManager.getLastKnownLocation(provider);//끝......

getLastKnownLocation메소드에 이용 가능한 공급자를 넘겨주면 Location션을 리턴 하십니다..
그럼 Location의 get메소드를 이용 하여 위치 정보를 얻으면 되지요..

double lat = location.getLatitude();
double lng = location.getLongitude();//참 쉽지요..

--------------------------------------숨 쉬 기------------------------------------------------

이제 위치 정보를 업데이트 하는 방법 입니다... 짧은 설명과 크드만 쓱~~
위치정보 업데이트는 아래 메소드를 call해서 이루어 집니다.

locationManager.requestLocationUpdates(provider, 2000, 10,locationListener);

전달되되는 값을 한번 살펴 보겠습니다. (provider, 1000, 10,locationListener)
                                                      (공급자, 업데이트 시간간격, 업데이트 거리m,리스너)
요말은 .....2초마다 업데이트 또는 거리다 10m 이상 바뀌었을 때~업데이트...한다는 소리죠..
누가~? LocationListener가...

private fi nal LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        //업데이트...
    }
    public void onProviderDisabled(String provider){
    }
    public void onProviderEnabled(String provider){ }
    public void onStatusChanged(String provider, int status,Bundle extras){ }
};

--------------------------------------숨 쉬 기 2 -----------------------------------------------
이제 Geocoder에 대해 알아 정리를 한번 해보겠습니다.
Geocoder는 위도/경도 값을 이용하여 주소값을 얻어 오거나 반대로 주소값를 이용하여 위도/경도를 얻을 수 있는 신기한 녀석 입니다.

Geocoder는 아래와 같이 얻어지며
Geocoder geocoder = new Geocoder(Context, Locale.default);
Locale은 지오코딩을 하기 위한 '지역'정보 입니다..Locale.US, Locale.KOREA 등등.....

geocoding에는 Forward Geocoding 과 Reverse Geocoding 이 있고
두 가지 모두 Address 리스트를 리턴 합니다.

List<Address> addresses = null;
List<Address> locations = null;
addresses = gc.getFromLocation(latitude, longitude, 10);//위도와 경도값을~
locations = fwdGeocoder.getFromLocationName("Seoul", 10); //주소값을~

Address클래스는 위도, 경도, 주소, 전화번호, 등등...많은 위치정보를 저장 하는 클래스이며
address.getXxx() 메소드를 이용 하여 정보를 얻을 수 있습니다. 자세한 내용은 레퍼런스를...보세요.;;

ps. 위치기반 서비스를 이용 하기 위하서는...
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>   
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
권한을 추가 하셔야 합니다.....권한에 대한 자세한 내용은 "Apress: Pro Android"의 7장에 잘 나오더군요..;;
전 저질 영어 실력이라..OTL...

2부에는..Google Maps API에 대한 내용을 정리 해야 겠습니다..
<본 게시물에 내용은 제 학습을 목적으로  정리한 글입니다. 그러므로  내용이 틀릴 가능성이 꾀 큽니다.>