소스 전문 모두 올립니다.
단순히 맵뷰 보여주고 현재 위치갱신 기능밖에 없습니다.
lomohome.com/316 블로그에 올려져있는 소스를 따라했습니다..
=====================================================================================
package ufc.org;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
public class UFC_Project extends MapActivity {
private MapView mapView; //맵뷰 객체
private List<Overlay> listOfOverlays; //맵에 표시된 오버레이(레이어)들을 가지고 있는 리스트
private String bestProvider; //현재 위치값을 가져오기위한 프로바이더. (network, gps)
private LocationManager locM; //위치 매니저
private LocationListener locL; //위치 리스너
private Location currentLocation; //현재 위치
private MapController mapController; //맵을 줌시키거나, 이동시키는데 사용될 컨트롤러
private LocationItemizedOverlay overlayHere; //현재위치 마커가 표시되어질 오버레이
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
overlayHere = null;
mapView = (MapView) findViewById(R.id.mapview); //맵뷰 객체를 가져온다.
mapView.setBuiltInZoomControls(true); //줌인,줌아웃 컨트롤을 표시한다.
mapController = mapView.getController(); //맵컨트롤러를 가져온다.
mapController.setZoom(17); //초기 확대는 17정도로..
//위치 매니저를 시스템으로부터 받아온다.
locM = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//사용가능한 적절한 프로바이더를 받아온다.
//network (보통 3G망,Wifi AP 위치정보)또는 gps 둘중 하나로 설정된다.
bestProvider = locM.getBestProvider(new Criteria(), true);
//기기에 가지고 있는 마지막 위치정보로 현재위치를 초기 설정한다.
currentLocation = locM.getLastKnownLocation(bestProvider);
//위치 리스너 초기화
locL = new MyLocationListener();
//위치 매니저에 위치 리스너를 셋팅한다.
//위치 리스너에서 10000ms (10초) 마다 10미터 이상 이동이 발견되면 업데이트를 하려한다.
locM.requestLocationUpdates(bestProvider, 10000, 10, locL);
//처음에 한번 맵뷰에 그려준다.
updateOverlay(currentLocation);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
/////////////////////내 위치 리스너///////////////////////////
public class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
//위치 이동이 발견되었을때 호출될 메소드.
//위의 설정에서 10초마다 100미터 이상 이동이 발견되면 호출된다.
updateOverlay(location);
}
@Override
public void onProviderDisabled(String provider) {
//Log.d("test", "GPS disabled : " + provider);
}
@Override
public void onProviderEnabled(String provider) {
//Log.d("test", "GPS Enabled : " + provider);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
//Log.d("test", "onStatusChanged : " + provider + " & status = "+ status);
}
}
protected void updateOverlay(Location location) {
//기존에 화면에 찍어둔 오버레이 (마커들)을 싹 지운다.
listOfOverlays = mapView.getOverlays(); //맵뷰에서 오버레이 리스트를 가져온다.
if (listOfOverlays.size() > 0) {
listOfOverlays.clear(); //오버레이가 있을때 싹 지워준다.
//Log.d("test", "clear overlays : " + listOfOverlays.size());
} else {
//Log.d("test", "empty overlays");
}
//Location 객체를 가지고 GeoPoint 객체를 얻어내는 메소드
GeoPoint geoPoint = getGeoPoint(location);
//현재위치를 표시할 이미지
Drawable marker;
//실제 운영소스엔 분기하여 현재위치와 선택위치 이미지를 변경하게 되어있다.
marker = getResources().getDrawable(R.drawable.icon_here);
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
//LocationItemizedOverlay 를 이용하여 현재위치 마커를 찍을 오버레이를 생성한다.
overlayHere = new LocationItemizedOverlay(marker);
//touch event 의 null pointer 버그를 방지하기 위해 마커를 찍고 바로 populate 시켜준다.
overlayHere.mPopulate();
//현재위치를 GeoCoder 를 이용하여 대략주소와 위,경도를 Toast 를 통하여 보여준다.
String geoString = showNowHere(location.getLatitude(), location.getLongitude() , true);
//현재위치 마커 정의
OverlayItem overlayItem = new OverlayItem(geoPoint, "here", geoString);
overlayHere.addOverlay(overlayItem); //현재위치 오버레이 리스트에 현재위치 마커를 넣는다.
/* 지점정보를 HTTP통신을 통해 서버에서 받아와서 전역변수인 brList (지점리스트)에 넣는다.
// 성능을 고려하여 쓰레드로 구현이 되어있다.
// 고다음 지점리스트 오버레이에 넣고 화면에 찍어주는 메소드.
showBranchMarker(location.getLatitude(), location.getLongitude(),
this.searchType, SEARCH_RANGE);
// 맵뷰에서 터치이벤트를 받을 오버레이를 추가한다.
// 특정지점을 오래 눌렀을때 특정 지점 기준으로 재검색을 하기 위하여 터치이벤트를 받아와야한다.
//mapView.getOverlays().add(new MapTouchDetectorOverlay());
*/ //마지막으로 생성된 오버레이레이어를 맵뷰에 추가한다.
mapView.getOverlays().add(overlayHere);
mapView.getController().animateTo(geoPoint); //현재위치로 화면을 이동한다.
mapView.postInvalidate(); //맵뷰를 다시 그려준다.
}
private GeoPoint getGeoPoint(Location location) {
if (location == null) {
return null;
}
Double lat = location.getLatitude() * 1E6;
Double lng = location.getLongitude() * 1E6;
return new GeoPoint(lat.intValue(), lng.intValue());
}
protected class LocationItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> overlays;
public LocationItemizedOverlay(Drawable defaultMarker) { //오버레이 생성자
//마커 이미지의 가운데 아랫부분이 마커에서 표시하는 포인트가 되게 한다.
super(boundCenterBottom(defaultMarker));
overlays = new ArrayList<OverlayItem>();
}
@Override
protected OverlayItem createItem(int i) {
return overlays.get(i);
}
@Override
public int size() {
return overlays.size();
}
public void addOverlay(OverlayItem overlay) {
overlays.add(overlay);
//null pointer 버그때문에 오버레이 아이템 추가후 가능한 빨리 populate 해줘야한다.
populate();
}
@Override
protected boolean onTap(int index) {
//마커를 눌렀을때 발생시킬 이벤트 메소드이다.
if ("here".equals(overlays.get(index).getTitle())) {
//현재 위치일 경우 간단한 토스트 메세지를 보여준다.
Toast.makeText(getApplicationContext(),
overlays.get(index).getSnippet(), Toast.LENGTH_SHORT)
.show();
} else {
/**/
}
return true;
}
//외부에서 마커의 populate 를 해주기 위한 메소드.
public void mPopulate() {
populate();
}
}
private String showNowHere(double lat, double lng , boolean showOption){
StringBuilder geoString = new StringBuilder();
try {
Geocoder goecoder = new Geocoder(getApplicationContext(),
Locale.getDefault());
Address adr = goecoder.getFromLocation(lat,
lng, 1).get(0);
if (adr.getLocality() != null) geoString.append(adr.getLocality()).append(" ");
if (adr.getThoroughfare() != null) geoString.append(adr.getThoroughfare());
if (!"".equals(geoString.toString())) geoString.append("\n\n");
} catch (Exception e) { }
geoString.append("위도 : ").append(lat).append(" ,경도 : ").append(lng);
if (showOption){
Toast.makeText(getApplicationContext(), geoString.toString(),
Toast.LENGTH_SHORT).show();
}
return geoString.toString();
}
}
=============================================================================
고수님들 돠주십시오;; 맵뷰의 세계는 참으로 오묘하군요....
08-24 12:44:00.319: INFO/ActivityManager(56): Process ufc.org (pid 256) has died.
08-24 12:44:00.579: INFO/UsageStats(56): Unexpected resume of com.android.launcher while already resumed in ufc.org
08-24 12:44:00.669: WARN/InputManagerService(56): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43d423d0
08-24 12:44:24.969: INFO/ActivityManager(56): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=ufc.org/.UFC_Project }
08-24 12:44:25.139: INFO/ActivityManager(56): Start proc ufc.org for activity ufc.org/.UFC_Project: pid=279 uid=10026 gids={3003}
08-24 12:44:25.649: DEBUG/ddm-heap(279): Got feature list request
08-24 12:44:26.219: WARN/dalvikvm(279): Class resolved by unexpected DEX: Lufc/org/UFC_Project;(0x43d02c70):0x11c370 ref [Lcom/google/android/maps/MapActivity;] Lcom/google/android/maps/MapActivity;(0x43d02c70):0x11c188
08-24 12:44:26.229: WARN/dalvikvm(279): (Lufc/org/UFC_Project; had used a different Lcom/google/android/maps/MapActivity; during pre-verification)
08-24 12:44:26.229: WARN/dalvikvm(279): Unable to resolve superclass of Lufc/org/UFC_Project; (41)
08-24 12:44:26.239: WARN/dalvikvm(279): Link of class 'Lufc/org/UFC_Project;' failed
08-24 12:44:26.259: DEBUG/AndroidRuntime(279): Shutting down VM
08-24 12:44:26.269: WARN/dalvikvm(279): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
08-24 12:44:26.290: ERROR/AndroidRuntime(279): Uncaught handler: thread main exiting due to uncaught exception
08-24 12:44:26.319: ERROR/AndroidRuntime(279): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at dalvik.system.DexFile.defineClass(Native Method)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:209)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:203)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.os.Handler.dispatchMessage(Handler.java:99)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.os.Looper.loop(Looper.java:123)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at android.app.ActivityThread.main(ActivityThread.java:4363)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at java.lang.reflect.Method.invokeNative(Native Method)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at java.lang.reflect.Method.invoke(Method.java:521)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-24 12:44:26.319: ERROR/AndroidRuntime(279): at dalvik.system.NativeStart.main(Native Method)
08-24 12:44:26.369: INFO/Process(56): Sending signal. PID: 279 SIG: 3
08-24 12:44:26.379: INFO/dalvikvm(279): threadid=7: reacting to signal 3
08-24 12:44:26.419: INFO/dalvikvm(279): Wrote stack trace to '/data/anr/traces.txt'
08-24 12:44:35.013: WARN/ActivityManager(56): Launch timeout has expired, giving up wake lock!
08-24 12:44:35.825: WARN/ActivityManager(56): Activity idle timeout for HistoryRecord{43d44228 ufc.org/.UFC_Project}
08-24 12:44:39.189: INFO/Process(279): Sending signal. PID: 279 SIG: 9
08-24 12:44:39.239: INFO/ActivityManager(56): Process ufc.org (pid 279) has died.
08-24 12:44:39.459: ERROR/gralloc(56): [unregister] handle 0x3fc740 still locked (state=40000001)
08-24 12:44:39.479: INFO/UsageStats(56): Unexpected resume of com.android.launcher while already resumed in ufc.org
08-24 12:44:39.599: WARN/InputManagerService(56): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43d5c500
이렇게 뜨는군요;; 로그 필터 설정후 잡아보려 해도 로그 캣을 주로 사용해 보지 않아서;;; 뭐가 문젠지 ㅠㅠ