2010-01-19 17 views
6

मैंने एक ऐसा एप्लिकेशन बनाने के लिए कुछ ट्यूटोरियल का पालन किया जो मानचित्र पर उपयोगकर्ता की वर्तमान स्थिति को चिह्नित करता है। लेकिन कुछ कारणों से मैं अंकन भाग काम नहीं कर सकता? अन्य भाग अच्छी तरह से काम करते हैं, लेकिन जब भी मैं अंकन कोड जोड़ता हूं तो एप्लिकेशन क्रैश हो जाता है।मानचित्र पर वर्तमान स्थान चिह्नित करना, एंड्रॉइड

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; 
    } 
} 
यहाँ

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

क्या आप क्रैश से लॉग पोस्ट करेंगे? अगर हम स्टैक ट्रेस देख सकते हैं तो यह सहायक होगा, इसलिए हम जानते हैं कि कौन सी रेखा दुर्घटनाग्रस्त हो जाती है। –

उत्तर

3

GeoPoint " पी "MyLocationOverlay में शून्य है। जब आप "पीओ" के साथ "जियोपॉइंट इनिट जीओपॉइंट" को फिर से चलाते हैं तो आप इस समस्या को हल कर सकते हैं।

0

आपके लॉग में इस लाइन 01-19 05:31:46.541: ERROR/AndroidRuntime(770): at pro.googlemapp.LocationActivity$MyLocationOverlay.draw(LocationActivity.java:101)

यह GeoPoint पी को संदर्भित करता है को देखो। शुरुआत में आप पी से शून्य (जैसा कि "asdf" कहते हैं) के मान को सेट करें और कभी भी अपने मूल्य को GeoPoint में न बदलें और यही कारण है कि आपको java.lang.NullPointerException मिलता है।

उदाहरण के लिए आप इस तरह पी का मान सेट कर सकते हैं: p = new GeoPoint(19240000,-99120000); और निश्चित रूप से यह अपने कोड की इस पंक्ति mapView.getProjection().toPixels(p, myScreenCoords); से पहले हो जाना चाहिए।

गुड लक

9

जिस तरह से आप का निर्माण MyLocationOverlay कुछ समस्या हो सकता है।

MyLocationOverlay mylocationOverlay = new MyLocationOverlay(this, mapView);

google code api यदि आप कोई संदर्भ और एक MapView परम उत्तीर्ण करने की आवश्यकता के अनुसार

और फिर उस

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

के बाद इन कोड डाल भी विधि onResume() में

mylocationOverlay.enableMyLocation(); डाल

आशा इस तुम्हारी मदद कर सकता।

0

ऐसा इसलिए है क्योंकि Geopoint p मान क्लास MyLocationListener में शून्य है। तो जब आप mapView.getProjection()। ToPixels (पी, myScreenCoords) कहा जाता है; क्योंकि पी शून्य है, यह पिक्सेल में कनवर्ट करने में असमर्थ है और अपवाद फेंकता है। आप अपने GeoPoint p को अपने स्थान सक्रियता में स्थिर के रूप में घोषित करके इस पर काबू पा सकते हैं।

संबंधित मुद्दे