2012-05-15 44 views
3

我想查找当前位置的地图并在OSMdroid中显示图标时进行更新当我给出具体的位置经纬度和绘制图标时没有问题,但有两个错误当我给当前位置的经度和纬度。找出OSMdroid中的当前位置

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); 
    setContentView(R.layout.main);   
    mMapView = (MapView) this.findViewById(R.id.mapview); 
    mMapView.setTileSource(TileSourceFactory.MAPNIK); 
    mMapView.setBuiltInZoomControls(true); 
    mMapView.setMultiTouchControls(true);   
    mapController = this.mMapView.getController(); 
    mapController.setZoom(15); 

    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 = mLocMgr.getBestProvider(criteria, true); 
    Location location = mLocMgr.getLastKnownLocation(provider); 
    GeoPoint mypoint = new GeoPoint(location.getLatitude(), location.getLongitude()); // centre map here 
    GeoPoint mypointicon = new GeoPoint(location.getLatitude()+1000, location.getLongitude()+1000); // icon goes here 
    mapController.setCenter(mypoint);    
    mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
    mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100, 
      this);   
    ArrayList<OverlayItem> items=new ArrayList<OverlayItem>(); 
    items.add(new OverlayItem("Here", "Sample Description", mypointicon)); 
    this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items, 
      new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { 
       @Override 
       public boolean onItemSingleTapUp(final int index, 
         final OverlayItem item) { 
        Toast.makeText(
          MapOverLayGiveActivity.this, 
          "Item '" + item.mTitle, Toast.LENGTH_LONG).show(); 
        return true; // We 'handled' this event. 
       } 
       @Override 
       public boolean onItemLongPress(final int index, 
         final OverlayItem item) { 
        Toast.makeText(
          MapOverLayGiveActivity.this, 
          "Item '" + item.mTitle ,Toast.LENGTH_LONG).show(); 
        return false; 
       } 
      }, mResourceProxy); 
    this.mMapView.getOverlays().add(this.mMyLocationOverlay); 
    mMapView.invalidate();   
} 

错误: 显示java.lang.NullPointerException
了java.lang.RuntimeException

什么是错在我的代码,我怎么能做到这一点?谢谢...

+0

我写了这个[文章](http://stackoverflow.com/questions/10575285/determine-user-location-on-osm-maps/10585267#答案10585267)。请看看它是否适合你。 –

+0

实际上我不想指定经度和纬度(MAP_DEFAULT_LATITUDE = 44.445883 MAP_DEFAULT_LONGITUDE = 26.040963),但OSMdroid会采用当前位置的纬度和经度。我可以做到吗? –

回答

1

您使用this.myLocationOverlay - 因为osmDroid绘制当前位置 - 但为了更新位置,您必须使用位置侦听器。另外,您必须使用mapView.getOverlays.clear()功能删除之前的覆盖图功能

好吧,让我们假设您没有访问Internet或GPS。在我看来,在地图上有一个默认点是安全的。 在这段代码中,我检查一个有效的位置。如果为null,那么我使用DEFAULT值。 在我的应用程序中,我没有任何问题。即使我的位置已更改,我也会在地图上绘制导航路径。

{ 
    Location location = null; 

      for (String provider : locationManager.getProviders(true)) 
      { 
       location = locationManager.getLastKnownLocation(provider); 
       if (location != null) 
       { 
        //location.setLatitude(MAP_DEFAULT_LATITUDE); 
        //location.setLongitude(MAP_DEFAULT_LONGITUDE); 
        locationManager.requestLocationUpdates(provider, 0, 0, mUpdateHandler); 
        break; 
       } 
      } 

      //add car position 
      if (location == null) 
      { 
       location = new Location(LocationManager.GPS_PROVIDER); 
       location.setLatitude(MAP_DEFAULT_LATITUDE); 
       location.setLongitude(MAP_DEFAULT_LONGITUDE); 
       updateCarPosition(new GeoPoint(location)); 
      } 

} 
6

要跟随位置的变化,实施LocationListener的如下:

public class MyLocationListener implements LocationListener { 

    public void onLocationChanged(Location location) { 
     currentLocation = new GeoPoint(location); 
     displayMyCurrentLocationOverlay(); 
    } 

    public void onProviderDisabled(String provider) { 
    } 

    public void onProviderEnabled(String provider) { 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
} 

内onCreate方法:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    locationListener = new MyLocationListener();   
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    if(location != null) { 
     currentLocation = new GeoPoint(location.getLatitude(), location.getLongitude()); 
    } 
} 

和displayMyCurrentLocationOverlay方法:

private void displayMyCurrentLocationOverlay() { 
    if(currentLocation != null) { 
     if(currentLocationOverlay == null) { 
      currentLocationOverlay = new ArrayItemizedOverlay(myLocationMarker); 
      myCurrentLocationOverlayItem = new OverlayItem(currentLocation, "My Location", "My Location!"); 
      currentLocationOverlay.addItem(myCurrentLocationOverlayItem); 
      mapView.getOverlays().add(currentLocationOverlay);    
     } else { 
      myCurrentLocationOverlayItem.setPoint(currentLocation); 
      currentLocationOverlay.requestRedraw(); 
     } 
     mapView.getController().setCenter(currentLocation); 
    }  
} 
+0

完美!!!,谢谢.... – TharakaNirmana

1

如果你测试上Emula然后记住使用DDMS来设置您当前的经纬度。如果你不这样做,getLastKnownLocation将返回null