안드로이드에서 지도위에 마커올리는것이 잘 안됩니다.
지도상에서 자신의 위치에서 가까운 버스정류장을 찾아주는 프로그램을 만들고 있습니다.
그런데 지도위에 마커올리려고 하면 자꾸 에러가 나버립니다.
일단 처음 실행후에 menu를 눌러 메뉴를 호출하고 그중에서 해당 버튼을 누르면
DB에 저장되어있는 정류장들을 조회해서 일정 거리안에 있는 버스정류장을 찾아서 지도상에 표시해주는 프로그램입니다.
소스코드는 이렇습니다.
/* 메인클레스 */ public boolean onOptionsItemSelected(MenuItem item){ super.onOptionsItemSelected(item); switch(item.getItemId()){ case(MENU_1): Resources r = getResources(); List<Overlay> overlays = mapView.getOverlays(); MyItemizedOverlay itemizedOverlay; Drawable marker = r.getDrawable(R.drawable.busstop); marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); itemizedOverlay = new MyItemizedOverlay(marker); /* 가까운버스정류장조회 메뉴 */ TextView myLocationText; myLocationText = (TextView)findViewById(R.id.myLocationText); 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); Double lat1 = location.getLatitude(); Double lng1 = location.getLongitude(); Cursor station = mDbHelper.getAllEntries(); if (station.moveToFirst()) { do { Double lat2 = station.getDouble(station.getColumnIndexOrThrow(BusDbAdapter.KEY_LAT)); Double lng2 = station.getDouble(station.getColumnIndexOrThrow(BusDbAdapter.KEY_LNG)); double dist = distance(lat1,lng1,lat2,lng2); if (dist <= 0.7) { lat2 = lat2 * 1E6; lng2 = lng2 * 1E6; GeoPoint geoPoint = new GeoPoint(lat2.intValue(), lng2.intValue()); OverlayItem overlayitem = new OverlayItem(geoPoint, "", ""); itemizedOverlay.addOverlay(overlayitem); } } while(station.moveToNext()); } overlays.add(itemizedOverlay); return true; } /* MyItemizedOverlay 클래스 */ public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> { // 마커에 대한 정보를 가진 콜렉션 private ArrayList<OverlayItem> items = new ArrayList<OverlayItem>(); public MyItemizedOverlay(Drawable defaultMarker) { super(defaultMarker); } public void addOverlay(OverlayItem overlay){ items.add(overlay); populate(); } @Override protected OverlayItem createItem(int index) { return items.get(index); } @Override public int size() { return items.size(); } }
<수정> Logcat내용 첨부합니다. 01-05 01:04:01.322: ERROR/AndroidRuntime(285): ERROR: thread attach failed 01-05 01:04:04.932: ERROR/ActivityThread(292): Failed to find provider info for com.google.settings 01-05 01:04:04.953: ERROR/ActivityThread(292): Failed to find provider info for com.google.settings 01-05 01:04:05.012: ERROR/ActivityThread(292): Failed to find provider info for com.google.settings 01-05 01:04:07.452: ERROR/MapActivity(292): Couldn't get connection factory client 01-05 01:04:11.932: ERROR/LocationMasfClient(52): getNetworkLocation(): accuracy is too high 25000 01-05 01:04:33.052: ERROR/AndroidRuntime(292): Uncaught handler: thread main exiting due to uncaught exception 01-05 01:04:33.251: ERROR/AndroidRuntime(292): java.lang.NullPointerException 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at kr.mashup.map.Mashup_Map.onOptionsItemSelected(Mashup_Map.java:313) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.app.Activity.onMenuItemSelected(Activity.java:2170) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:525) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.view.View.onTouchEvent(View.java:4179) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.widget.TextView.onTouchEvent(TextView.java:6534) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.view.View.dispatchTouchEvent(View.java:3709) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.os.Handler.dispatchMessage(Handler.java:99) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.os.Looper.loop(Looper.java:123) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at android.app.ActivityThread.main(ActivityThread.java:4338) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at java.lang.reflect.Method.invokeNative(Native Method) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at java.lang.reflect.Method.invoke(Method.java:521) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 01-05 01:04:33.251: ERROR/AndroidRuntime(292): at dalvik.system.NativeStart.main(Native Method) 01-05 01:04:36.382: ERROR/NetworkLocationProvider(52): releaseCheckLocationLock: wake lock has already been released
이렇게 작성했습니다.
계속 프로그램이 에러가 나서 죽는데 무슨 이유일까요?
고수님들 알려주세요~!
궁금해서 어쭤 봅니다.
혹시 버스 정류장 좌표는 어떻게 구하셨나요?
서울버스노선 엑셀파일을 wsg로 변환하였으나 오차가 너무 커서 쓸수가 없네요.
그리고 그 많은 데이터를 어떻게 얻어 오셨는지요?
해결 댓글이 아니라서 죄송하네요. 꾸~~벅
01-05 01:04:33.251:
이 로그 보시면 아시겠지만, Mashup_Map.java 313 라인에서 NullPointerException 이 발생했습니다. 해당 라인에 Breakpoint 걸어보시고 왜 null 이 들어가는지 고민해 보세요.
댓글 달기