현재 위치를 위성으로 부터 받아서 마커 표시 후 특정 위치 마커 표시하려고 합니다.
제가 초보라 이 문제를 어떻게 해결 해야 할지 모르겠네요.
안드로이드 3.0 (google api)
NullpointerExcption 에러 인데;; 정말 모르겠네요;
-------------------------------------------------------------------
package dblab.gp;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.ImageView;
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.MapView.LayoutParams;
import com.google.android.maps.OverlayItem;
public class MapoverlayActivity extends MapActivity implements LocationListener {
MapView mMapview;
MapController mMC;
LocationManager lm = null;
String mProvider;
GeoPoint mMyloc;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapview = (MapView) findViewById(R.id.mapview);
MapView.LayoutParams mapLayoutParams_myloc = new MapView.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, mMyloc,
MapView.LayoutParams.CENTER);
ImageView myloc = new ImageView(getApplicationContext());
myloc.setImageResource(R.drawable.ic_launcher);
mMapview.addView(myloc, mapLayoutParams_myloc);
Drawable marker_yewon = getResources().getDrawable(
R.drawable.blue_marker);
marker_yewon.setBounds(0, 0, marker_yewon.getIntrinsicWidth(),
marker_yewon.getIntrinsicHeight());
mMapview.getOverlays().add(new SitesOverlay(marker_yewon));
mMC = mMapview.getController();
mMC.setCenter(mMyloc);
mMC.setZoom(17);
mMapview.setBuiltInZoomControls(true);
lm.requestLocationUpdates(mProvider, 1000, 10, MapoverlayActivity.this);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
double lat = location.getLatitude();
double lon = location.getLongitude();
mMyloc = getpoint(lat , lon );
}
private GeoPoint getpoint(double lat, double lon) {
return (new GeoPoint((int) (lat * 1000000.0), (int) (lon * 1000000.0)));
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
public class SitesOverlay extends ItemizedOverlay<OverlayItem> {
Drawable marker_yewon = null;
List<OverlayItem> items = new ArrayList<OverlayItem>();
public SitesOverlay(Drawable marker_yewon) {
super(marker_yewon);
this.marker_yewon = marker_yewon;
// TODO Auto-generated constructor stub
items.add(new OverlayItem(getpoint(37.1805751, 128.2038425), "한식",
"예원"));
populate();
}
@Override
protected OverlayItem createItem(int i) {
// TODO Auto-generated method stub
return items.get(i);
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
// TODO Auto-generated method stub
super.draw(canvas, mapView, shadow);
boundCenter(marker_yewon);
}
@Override
protected boolean onTap(int i) {
// TODO Auto-generated method stub
Toast.makeText(MapoverlayActivity.this, items.get(i).getSnippet(),
Toast.LENGTH_SHORT).show();
return true;
}
@Override
public int size() {
// TODO Auto-generated method stub
return items.size();
}
}
@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
}
}
---------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dblab.gp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="11" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MapoverlayActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="com.google.android.maps" android:required="true"/>
</application>
</manifest>
---------------------------------------------------------------------------------------------------------------------
04-07 21:41:11.640: E/AndroidRuntime(4872): FATAL EXCEPTION: main
04-07 21:41:11.640: E/AndroidRuntime(4872): java.lang.RuntimeException: Unable to start activity ComponentInfo{dblab.gp/dblab.gp.MapoverlayActivity}: java.lang.NullPointerException
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1818)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1834)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1027)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.os.Handler.dispatchMessage(Handler.java:99)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.os.Looper.loop(Looper.java:132)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.app.ActivityThread.main(ActivityThread.java:4126)
04-07 21:41:11.640: E/AndroidRuntime(4872): at java.lang.reflect.Method.invokeNative(Native Method)
04-07 21:41:11.640: E/AndroidRuntime(4872): at java.lang.reflect.Method.invoke(Method.java:491)
04-07 21:41:11.640: E/AndroidRuntime(4872): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
04-07 21:41:11.640: E/AndroidRuntime(4872): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
04-07 21:41:11.640: E/AndroidRuntime(4872): at dalvik.system.NativeStart.main(Native Method)
04-07 21:41:11.640: E/AndroidRuntime(4872): Caused by: java.lang.NullPointerException
04-07 21:41:11.640: E/AndroidRuntime(4872): at com.google.android.maps.MapController.setCenter(MapController.java:345)
04-07 21:41:11.640: E/AndroidRuntime(4872): at dblab.gp.MapoverlayActivity.onCreate(MapoverlayActivity.java:58)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
04-07 21:41:11.640: E/AndroidRuntime(4872): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1782)
04-07 21:41:11.640: E/AndroidRuntime(4872): ... 11 more




mMyloc객체가 Null입니다.
onCreate()에서 mMyloc객체를 setCenter메소드로 넘겨주려고 하고있는데
mMyloc는 Null이라서 에러가 뜬겁니다.
mMyloc객체 초기화가 onChangedListener()에서 이뤄지고있는데
메소드명에서도 알수 있듯이 자신의 현재위치에서 다른위치로 변경됐을 때에만 호출되는 메소드입니다.
그래서, onChangedListener가 호출이 되기전에 onCreate에서 mMyloc를 사용하려고하니 에러가 나는거고요.
mMyloc객체 초기화부터 이뤄지고나서 setCenter(mMyloc)를 해야 할 겁니다.