------------------------------------------------------------------------------------------------
출처: http://ableperson.tistory.com/entry/안드로이드-구글맵-구현-시-주의사항
------------------------------------------------------------------------------------------------
안드로이드에서 구글맵 구현 시 내 위치를 추적하는 코드를 작성할 때 대부분은
퍼미션을 android.permission.ACCESS_FINE_LOCATION으로 지정하는 경우가 많다.
그것은 바로 건물 내부에서는 GPS 추적이 불가능하다는 점. 즉 위성과 디바이스가
연동되지 않으면 사용자가 마지막에 GPS를 구동시켰던 장소를 내 현재 위치로
잡게 되므로 문제가 발생한다.
예를 들어. 최종적으로 GPS를 구동시켰던 위치가 부산이라고 가정한 후 서울로
올라와서.. gps 송수신이 안 되는 지역에서 어플을 구동시키게 되면 내 현재위치는
부산으로 인식하게 된다. (GPS 송수신이 되는 지역이면 상관없음)
그러므로 코드상에 GPS를 현재 잡지 못하는 경우를 조건문으로 걸어 따로 처리해야
한다.
대부분의 안드로이드 교재, 인터넷에서 안드로이드 구글맵 관련 코드를 뒤적거려보면 이런 형식의 코드를 자주 볼 수 있다.
String location_context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(location_context);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 1000, 10, locationListener);
하지만 이렇게 코드를 구현하면 방금 말한 '부산-서울' 문제가 발생하게 되므로
코드 내부에 GPS를 인식하지 못하는 경우를 조건문으로 처리해야 한다.
if(!locationManager.isProviderEnabled(provider)&&locationManager.getLastKnownLocation(provider)!=null) // GPS 사용이 가능한 경우
{
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 1000, 10, locationListener);
Toast.makeText(getApplicationContext(),"gps 이용가능",Toast.LENGTH_SHORT).show();
}
else // GPS 사용이 불가능하여 네트워크로 추적해야 되는 경우
{
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
provider = locationManager.getBestProvider(criteria, true);
location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 1000, 10, locationListener);
Toast.makeText(getApplicationContext(),"gps이용불가, 네트워크로 추적",
Toast.LENGTH_SHORT).show();
}
또한 permission을 android.permission.COARSE_FINE_LOCATION도 같이 지정해 줘야
한다. ACCESS_FINE_LOCATION의 경우 위성과 직접 연결되어 내 위치를 받아오는
경우의 퍼미션이며, ACCESS_COARSE_LOCATION의 경우 위성과 직접 연결되는 것이 아니라 네트워크를 기반으로 내 위치를 받아오는 경우의 퍼미션이다.
총 두개의 퍼미션을 지정해 줘야 하는것이다.
위와같이 조건문을 걸어주기 귀찮다면 Criteria 클래스 선언 후 따로 설정해 주는
코드를 작성하지 말고
provider = locationManager.getBestProvider(new Criteria(), true);
|
로 코드를 바꿔주면 사용자의 상황에 따라 gps로 연동할지, 네트워크로 추적할지
자동으로 알아서 결정해준다.
또한 직접 구동시켜 보면 알겠지만, WI-FI에 연결된경우 내 위치를 정확하게 받아오는 편이며 3G를 이용하는 경우 조금 덜 정확하게 받아오는 편이니 이것을 신경 써서
작업을 해야 할 것이다.
그렇다면 사용자가 건물 지하에 있고, WI-FI나 3G에도 접속할 수 없다면?
간단하다~ 그 사용자는 해당 어플을 사용할 수 없다. - -
[Debug 용]
MD5 : keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android
(만약 SHA1만 출력될 경우 "-list" 앞에 "-v" 옵션을 추가한다.)
[Release 용]
MD5 : keytool -list -keystore ./생성한키파일명.keystore -storepass 생성한키파일비밀번호 -keypass 생성한키파일비밀번호
(만약 SHA1만 출력될 경우 "-list" 앞에 "-v" 옵션을 추가한다.)
[Key 값 생성]
http://code.google.com/android/maps-api-signup.html
'IT_Programming > Android_Java' 카테고리의 다른 글
ImageView scaling TOP_CROP (0) | 2011.09.01 |
---|---|
Activity & Service & Fragment & View Lifecycle (0) | 2011.08.17 |
Android Multithreading For Performance (0) | 2011.08.10 |
[Ant & Android] Ant를 이용한 Android Build (0) | 2011.08.09 |
Parcelable을 사용한 오브젝트 전달 (Object serialization using Parcelable) (0) | 2011.08.02 |