구글맵에 특정 위치가 중앙에 오게 하려고 좌표를 입력해놨는데요
저는 지피에스 신호를 받아오겠다는 코딩을 하지도 않았는데
현제 위치가 찍히는데 이거 왜그러는 거죠?
(액티비티를 하나 더 만들어서 버튼을 누르면 구글맵이 켜지게 했습니다.)
public class guide extends MapActivity {
/** Called when the activity is first created. */
MapView mMap;
MyLocationOverlay2 mLocation;
protected boolean isRouteDisplayed() {
return false;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.guide);
mMap = (MapView)findViewById(R.id.map_view);
MapController mapControl = mMap.getController();
mapControl.setZoom(18);
mMap.setBuiltInZoomControls(true);
GeoPoint pt = new GeoPoint(35178456, 126909299);
mapControl.setCenter(pt);
mLocation = new MyLocationOverlay2(this, mMap);
List<Overlay> overlays = mMap.getOverlays();
overlays.add(mLocation);
mLocation.runOnFirstFix(new Runnable() {
public void run() {
mMap.getController().animateTo(mLocation.getMyLocation());
}
});
}
public void onResume() {
super.onResume();
mLocation.enableMyLocation();
mLocation.enableCompass();
}
public void onPause() {
super.onPause();
mLocation.disableMyLocation();
mLocation.disableCompass();
}
class MyLocationOverlay2 extends MyLocationOverlay {
public MyLocationOverlay2(Context context, MapView mapView) {
super(context, mapView);
}
}
}방금 저도 약간 예민하게 답변을 달았는데 얼른 후회감이 밀려와 지웠구요.. 위 소스를 코딩하셨다고 하는데...
코딩하였다면 위 현상이 일어나는 것은 당연한 일이지요. 그런 논리로 코딩되어있으니까요...
그런 코드에서의 당연한 결과를 문제라고 생각하신다면 코딩하신게 아니라는 씁쓸한 생각이 들구요.
저또한 copy&paste를 애용하는 입장이라 그 부분에 대한 부정적인 견해는 없습니다만
그 중간에 understand가 빠져있다는 것은 매우 아쉽고 매우 위험한 일이 아닐까요...
저도 아직까지 그 understand가 매우 결여되서 매우 위험한 코드를 짜고 있다는 생각이 들기에 쓴소리할 입장은 아니지만, ㅠ..ㅠ
남이 짠 소스(노력)를 copy&paste하기 위한 최소한의 예의는 해당 소스를 understand하는 노력에 있다는 생각이 듭니다..
그리고 위 코드에 대한 이해를 돕기 위해 따로 답변을 답니다.
mLocation = new MyLocationOverlay2(this, mMap);
mLocation.runOnFirstFix(new Runnable() {
public void run() {
mMap.getController().animateTo(mLocation.getMyLocation());
}
});
runOnFirstFix메소드가 Runnable에 등록(일종의 Thread)되어 GPS값을 읽어오게 되면 읽어온 위치로 이동하라는 뜻이지요. 고로 onCreate상에서 setCenter를 하던 안하던 스레드에서 돌고있던 runOnfirstFix가 현재 위치의 GPS값을 성공적으로 읽어오게된 경우 Activity가 시작된지 한참 후에라도 setCenter(animateTo)를 하게 됩니당..간단히 정리 요약하여 해결책을 생각해보자면,
1. 현재위치만 읽어오고 싶으면 전역변수로 GeoPoint g를 등록하고 run()내부에서 읽어온 현재 위치를 g에 할당하는 코딩.
2. 현재위치는 필요없다면 runOnfirstFix 관련 메소드 삭제.
친절하신 댓글 정말 감사 합니다.
처음부터 차근차근 배워온게 아니고 gps 부분만 필요해서 이부분만 해보려니 기초가 부족한게 여실히 드러나고 있네요
댓글 보니 당연한걸 묻고 있는 제가 좀 한심 했습니다.
참고하고 좀 고쳐서 코드를 다시 바꿧는데요....
액티비티를 하나로 해서 하면 잘 돌아 가는데
액티비티를 두개 만들어서 두번째 액티비티에서 맵뷰가 나오게 해서 하려고 하는데
코드에 오류는 없는데 실행하면 첫번째 액티비티는 잘 되는데
다음 엑티비티를 넘어가면 "죄송합니다 예기치 않게 종료되었습니다?" 이렇게 나옵니다
왜그러는 걸까요?
제발 한번만 더 도와주시면 안될까요?
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): FATAL EXCEPTION: main
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): java.lang.RuntimeException: Unable to start activity ComponentInfo{test.Smart_guide/test.Smart_guide.guide}: java.lang.NullPointerException
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2768)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.app.ActivityThread.access$2500(ActivityThread.java:129)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2117)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.os.Looper.loop(Looper.java:143)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.app.ActivityThread.main(ActivityThread.java:4732)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at java.lang.reflect.Method.invokeNative(Native Method)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at java.lang.reflect.Method.invoke(Method.java:521)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at dalvik.system.NativeStart.main(Native Method)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): Caused by: java.lang.NullPointerException
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at test.Smart_guide.guide.onCreate(guide.java:32)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2732)
06-18 01:24:43.053: ERROR/AndroidRuntime(18473): ... 11 more
그리고 소스코드는
public class mapp extends MapActivity implements LocationListener {
MapController mapControl;
MapView map;
LocationManager locationMgr = null;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
map = (MapView) findViewById(R.id.map_view);
mapControl = map.getController();
locationMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.NO_REQUIREMENT);
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
locationMgr.requestLocationUpdates("gps", 1000, 0, mapp.this);
}
@Override
public void onLocationChanged(Location location) {
double lat = location.getLatitude();
double lon = location.getLongitude();
GeoPoint newPoint = new GeoPoint((int)(lat * 1E6), (int)(lon*1E6));
mapControl.animateTo(newPoint);
mapControl.setZoom(18);
MapView.LayoutParams mapMarkerParams = new MapView.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, newPoint,
MapView.LayoutParams.TOP_LEFT);
ImageView mapMarker = new ImageView(getApplicationContext());
mapMarker.setImageResource(R.drawable.gmarker);
map.addView(mapMarker, mapMarkerParams);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
염치 없지만 한번만 더 도와주세요 제발~



