2010-01-19 15 views
6

Ho seguito alcuni tutorial per creare un'applicazione che mostra la posizione corrente dell'utente sulla mappa con un segno. Ma per qualche motivo non riesco a lavorare sulla parte di marcatura? Le altre parti funzionano bene, ma ogni volta che aggiungo il codice di marcatura l'applicazione si blocca.
ecco il codice:Contrassegno posizione corrente sulla mappa, Android

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; 
    } 
} 

Ecco il logcat:

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 = [email protected] 
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 
+2

Vuoi pubblicare il registro dallo schianto? Sarebbe utile se potessimo vedere la traccia dello stack, quindi sappiamo quale linea si blocca. –

risposta

3

Il GeoPoint " p "in MyLocationOverlay è nullo. Quando si riproduce "GeoPoint initGeoPoint" con "p" è possibile risolvere questo problema.

0

Nel vostro log un'occhiata a questa linea 01-19 05:31:46.541: ERROR/AndroidRuntime(770): at pro.googlemapp.LocationActivity$MyLocationOverlay.draw(LocationActivity.java:101)

Questo si riferisce al GeoPoint p. All'inizio si imposta il valore di p a null (come dice "asdf") e non si cambia mai il suo valore in un GeoPoint ed è per questo che si ottiene java.lang.NullPointerException.

Ad esempio è possibile impostare il valore di p in questo modo: p = new GeoPoint(19240000,-99120000); e naturalmente questo deve accadere prima che questa linea mapView.getProjection().toPixels(p, myScreenCoords); del codice.

Buona fortuna

9

il modo di costruire il MyLocationOverlay potrebbe avere qualche problema.

MyLocationOverlay mylocationOverlay = new MyLocationOverlay(this, mapView);

secondo il google code api è necessario passare un contesto e un param mapview.

e poi mettere questi codice dopo che

mylocationOverlay.enableMyLocation(); 
mapView.getOverlays().add(locationOverlay); 

anche messo

mylocationOverlay.enableMyLocation(); nel metodo onResume()

Spero che questo potrebbe aiutare.

0

Questo perché il valore p di Geopoint è nullo nella classe MyLocationListener. Quindi quando hai chiamato mapView.getProjection(). ToPixels (p, myScreenCoords); poiché p è nullo, non è in grado di convertire in PIXels e genera Exception. Puoi superare questo problema dichiarando GeoPoint p come statico in LocationActivity.

Problemi correlati