在地图上标记当前位置,Android
我按照一些教程创建了一个应用程序,用一个标记显示用户在地图上的当前位置。但由于某些原因,我无法完成标记部分?其他部分工作正常,但每当我添加标记代码时,应用程序就会崩溃。在地图上标记当前位置,Android,android,overlay,android-emulator,Android,Overlay,Android Emulator,我按照一些教程创建了一个应用程序,用一个标记显示用户在地图上的当前位置。但由于某些原因,我无法完成标记部分?其他部分工作正常,但每当我添加标记代码时,应用程序就会崩溃。 代码如下: public class LocationActivity extends MapActivity { private MapView mapView; private LocationManager lm; private LocationListener ll; private
代码如下:
public class LocationActivity extends MapActivity {
private MapView mapView;
private LocationManager lm;
private LocationListener ll;
private MapController mc;
GeoPoint p = null;
Drawable defaultMarker = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapView);
// show zoom in/out buttons
mapView.setBuiltInZoomControls(true);
// Standard view of the map(map/sat)
mapView.setSatellite(false);
// get controller of the map for zooming in/out
mc = mapView.getController();
// Zoom Level
mc.setZoom(18);
MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
List<Overlay> list = mapView.getOverlays();
list.add(myLocationOverlay);
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
// Get the current location in start-up
GeoPoint initGeoPoint = new GeoPoint((int) (lm.getLastKnownLocation(
LocationManager.GPS_PROVIDER).getLatitude() * 1000000),
(int) (lm.getLastKnownLocation(LocationManager.GPS_PROVIDER)
.getLongitude() * 1000000));
mc.animateTo(initGeoPoint);
}
protected class MyLocationOverlay extends com.google.android.maps.Overlay {
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
long when) {
Paint paint = new Paint();
super.draw(canvas, mapView, shadow);
// Converts lat/lng-Point to OUR coordinates on the screen.
Point myScreenCoords = new Point();
mapView.getProjection().toPixels(p, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 255, 255);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.push);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText("I am here...", myScreenCoords.x, myScreenCoords.y,
paint);
return true;
}
}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location argLocation) {
GeoPoint myGeoPoint = new GeoPoint(
(int) (argLocation.getLatitude() * 1000000),
(int) (argLocation.getLongitude() * 1000000));
/*
* it will show a message on location change
* Toast.makeText(getBaseContext(), "New location latitude ["
* +argLocation.getLatitude() + "] longitude [" +
* argLocation.getLongitude()+"]", Toast.LENGTH_SHORT).show();
*/
mc.animateTo(myGeoPoint);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
}
protected boolean isRouteDisplayed() {
return false;
}
}
公共类LocationActivity扩展了MapActivity{
私有地图视图;
私人位置经理lm;
私人场所;
专用地图控制器;
地质点p=零;
Drawable defaultMarker=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView=(mapView)findViewById(R.id.mapView);
//显示放大/缩小按钮
mapView.SetBuilTinZoomControl(真);
//地图的标准视图(地图/卫星)
mapView.setSatellite(假);
//获取用于放大/缩小的地图控制器
mc=mapView.getController();
//缩放级别
mc.setZoom(18);
MyLocationOverlay MyLocationOverlay=新建MyLocationOverlay();
List=mapView.getOverlays();
列表。添加(myLocationOverlay);
lm=(LocationManager)getSystemService(Context.LOCATION\u服务);
ll=新的MyLocationListener();
lm.RequestLocationUpdate(LocationManager.GPS_提供程序,0,0,ll);
//获取启动中的当前位置
地质点初始地质点=新的地质点((int)(lm.getLastKnownLocation)(
LocationManager.GPS_PROVIDER).getLatitude()*1000000),
(int)(lm.getLastKnownLocation(LocationManager.GPS\U提供商)
.getLongitude()*1000000));
动画师(初始点);
}
受保护类MyLocationOverlay扩展了com.google.android.maps.Overlay{
@凌驾
公共布尔绘制(画布、地图视图、地图视图、布尔阴影、,
很久以前){
油漆=新油漆();
super.draw(画布、地图视图、阴影);
//将lat/lng点转换为屏幕上的坐标。
点myScreenCoords=新点();
getProjection().toPixels(p,myScreenCoords);
油漆。设置行程宽度(1);
setARGB(255、255、255、255);
绘制.设置样式(绘制.样式.笔划);
位图bmp=BitmapFactory.decodeResource(getResources(),
R.可拉拔、推压);
drawBitmap(bmp,myScreenCoods.x,myScreenCoods.y,paint);
canvas.drawText(“我在这里…”)、myscreencoods.x、myscreencoods.y、,
油漆);
返回true;
}
}
私有类MyLocationListener实现LocationListener{
已更改位置上的公共void(位置argLocation){
地质点myGeoPoint=新地质点(
(int)(argLocation.getLatitude()*1000000),
(int)(argLocation.getLongitude()*1000000));
/*
*它将显示位置更改消息
*Toast.makeText(getBaseContext(),“新位置纬度[”
*+argLocation.getLatitude()+“]经度[”+
*argLocation.getLongitude()+“]”,Toast.LENGTH_SHORT.show();
*/
动画师(myGeoPoint);
}
公共无效onProviderDisabled(字符串提供程序){}
公共无效onProviderEnabled(字符串提供程序){}
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){}
}
受保护的布尔值isRouteDisplayed(){
返回false;
}
}
以下是日志:
01-19 05:31:43.011: DEBUG/AndroidRuntime(759): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
01-19 05:31:43.011: DEBUG/AndroidRuntime(759): CheckJNI is ON
01-19 05:31:43.411: DEBUG/AndroidRuntime(759): --- registering native functions ---
01-19 05:31:43.431: INFO/jdwp(759): received file descriptor 19 from ADB
01-19 05:31:43.431: INFO/jdwp(759): Ignoring second debugger -- accepting and dropping
01-19 05:31:44.531: INFO/ActivityManager(583): Starting activity: Intent { flg=0x10000000 cmp=pro.googlemapp/.LocationActivity }
01-19 05:31:44.641: DEBUG/AndroidRuntime(759): Shutting down VM
01-19 05:31:44.641: DEBUG/dalvikvm(759): DestroyJavaVM waiting for non-daemon threads to exit
01-19 05:31:44.641: DEBUG/dalvikvm(759): DestroyJavaVM shutting VM down
01-19 05:31:44.641: DEBUG/dalvikvm(759): HeapWorker thread shutting down
01-19 05:31:44.651: DEBUG/dalvikvm(759): HeapWorker thread has shut down
01-19 05:31:44.651: DEBUG/jdwp(759): JDWP shutting down net...
01-19 05:31:44.651: DEBUG/jdwp(759): +++ peer disconnected
01-19 05:31:44.651: INFO/dalvikvm(759): Debugger has detached; object registry had 1 entries
01-19 05:31:44.661: DEBUG/dalvikvm(759): VM cleaning up
01-19 05:31:44.681: INFO/ActivityManager(583): Start proc pro.googlemapp for activity pro.googlemapp/.LocationActivity: pid=770 uid=10025 gids={3003}
01-19 05:31:44.761: DEBUG/dalvikvm(759): LinearAlloc 0x0 used 676436 of 4194304 (16%)
01-19 05:31:44.801: INFO/jdwp(770): received file descriptor 20 from ADB
01-19 05:31:44.822: INFO/dalvikvm(770): ignoring registerObject request in thread=3
01-19 05:31:44.851: INFO/jdwp(770): Ignoring second debugger -- accepting and dropping
01-19 05:31:44.851: ERROR/jdwp(770): Failed writing handshake bytes: Broken pipe (-1 of 14)
01-19 05:31:44.851: INFO/dalvikvm(770): Debugger has detached; object registry had 0 entries
01-19 05:31:45.320: ERROR/ActivityThread(770): Failed to find provider info for com.google.settings
01-19 05:31:45.320: ERROR/ActivityThread(770): Failed to find provider info for com.google.settings
01-19 05:31:45.340: ERROR/ActivityThread(770): Failed to find provider info for com.google.settings
01-19 05:31:45.781: DEBUG/LocationManager(770): Constructor: service = android.location.ILocationManager$Stub$Proxy@4379d9f0
01-19 05:31:45.791: WARN/GpsLocationProvider(583): Duplicate add listener for uid 10025
01-19 05:31:45.791: DEBUG/GpsLocationProvider(583): setMinTime 0
01-19 05:31:45.791: DEBUG/GpsLocationProvider(583): startNavigating
01-19 05:31:45.831: INFO/jdwp(770): received file descriptor 27 from ADB
01-19 05:31:46.001: INFO/MapActivity(770): Handling network change notification:CONNECTED
01-19 05:31:46.001: ERROR/MapActivity(770): Couldn't get connection factory client
01-19 05:31:46.451: DEBUG/dalvikvm(770): GC freed 4539 objects / 298952 bytes in 118ms
01-19 05:31:46.470: DEBUG/AndroidRuntime(770): Shutting down VM
01-19 05:31:46.470: WARN/dalvikvm(770): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
01-19 05:31:46.481: ERROR/AndroidRuntime(770): Uncaught handler: thread main exiting due to uncaught exception
01-19 05:31:46.541: ERROR/AndroidRuntime(770): java.lang.NullPointerException
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at com.google.android.maps.PixelConverter.toPixels(PixelConverter.java:58)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at com.google.android.maps.PixelConverter.toPixels(PixelConverter.java:48)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at pro.googlemapp.LocationActivity$MyLocationOverlay.draw(LocationActivity.java:101)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:42)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at com.google.android.maps.MapView.onDraw(MapView.java:476)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.View.draw(View.java:6274)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.View.draw(View.java:6277)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.widget.FrameLayout.draw(FrameLayout.java:352)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.View.draw(View.java:6277)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.widget.FrameLayout.draw(FrameLayout.java:352)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1883)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewRoot.draw(ViewRoot.java:1332)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewRoot.performTraversals(ViewRoot.java:1097)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.os.Handler.dispatchMessage(Handler.java:99)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.os.Looper.loop(Looper.java:123)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at android.app.ActivityThread.main(ActivityThread.java:4203)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at java.lang.reflect.Method.invokeNative(Native Method)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at java.lang.reflect.Method.invoke(Method.java:521)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
01-19 05:31:46.541: ERROR/AndroidRuntime(770): at dalvik.system.NativeStart.main(Native Method)
01-19 05:31:46.551: INFO/Process(583): Sending signal. PID: 770 SIG: 3
01-19 05:31:46.581: INFO/dalvikvm(770): threadid=7: reacting to signal 3
01-19 05:31:46.661: INFO/dalvikvm(770): Wrote stack trace to '/data/anr/traces.txt'
01-19 05:31:46.871: INFO/ARMAssembler(583): generated scanline__00000077:03515104_00000000_00000000 [ 27 ipp] (41 ins) at [0x2c69c8:0x2c6a6c] in 973448 ns
01-19 05:31:46.911: INFO/ARMAssembler(583): generated scanline__00000077:03515104_00001001_00000000 [ 64 ipp] (84 ins) at [0x2c6a70:0x2c6bc0] in 1985378 ns
01-19 05:31:49.881: INFO/Process(770): Sending signal. PID: 770 SIG: 9
01-19 05:31:49.931: INFO/ActivityManager(583): Process pro.googlemapp (pid 770) has died.
01-19 05:31:49.941: WARN/GpsLocationProvider(583): Unneeded remove listener for uid 1000
01-19 05:31:49.941: DEBUG/GpsLocationProvider(583): stopNavigating
01-19 05:31:49.951: INFO/WindowManager(583): WIN DEATH: Window{438891c0 pro.googlemapp/pro.googlemapp.LocationActivity paused=false}
01-19 05:31:50.111: WARN/UsageStats(583): Unexpected resume of com.android.launcher while already resumed in pro.googlemapp
01-19 05:31:50.200: WARN/InputManagerService(583): Got RemoteException sending setActive(false) notification to pid 770 uid 10025
01-19 05:31:43.011:DEBUG/AndroidRuntime(759):>>>>>>>>>>>>>>>>>>AndroidRuntime START这可能有助于您解决byg问题:
MyLocationOverlay中的地质点“p”为空。当您用“p”重播“GeoPoint initGeoPoint”时,您可以解决这个问题。在日志中查看这行01-19 05:31:46.541:ERROR/AndroidRuntime(770):在pro.googlemapp.LocationActivity$MyLocationOverlay.draw(LocationActivity.java:101)
这是指地质点p。开始时,您将p的值设置为null(如“asdf”所述),并且从不将其值更改为地质点,这就是为什么您会得到java.lang.NullPointerException
例如,可以如下设置p的值:p=new GeoPoint(19240000,-99120000)当然,这必须发生在这一行mapView.getProjection().toPixels(p,myScreenCoords)之前代码>你的代码
祝你好运你构建MyLocationOverlay的方式可能有一些问题
MyLocationOverlay MyLocationOverlay=新建MyLocationOverlay(此为地图视图)代码>
根据需要,您需要传递一个上下文和一个mapview参数
然后把这些代码放在后面
mylocationOverlay.enableMyLocation();
mapView.getOverlays().add(locationOverlay);
也放
mylocationOverlay.enableMyLocation()
希望这能对您有所帮助。这是因为MyLocationListener类中的Geopoint p值为null。因此,当您调用mapView.getProjection().toPixels(p,myScreenCoords)时;因为p为null,所以它无法转换toPixels并引发异常。您只需在LocationActivity中将您的地质点p声明为静态,就可以克服此问题。请发布崩溃日志好吗?如果我们能看到堆栈跟踪,这样我们就能知道哪一行崩溃了,这会很有帮助。