Использование MylocationOverlay в osmdroid

Я не могу заставить MyLocationOverlay работать, я искал и пробовал много кодов, но ни одного рабочего. У меня только черный экран. Мне нужно, чтобы отслеживать местоположение пользователя. Мне удалось отследить местоположение пользователя с регулярным наложением, но я заметил, что для каждого нового местоположения карта загружается снова (что очень раздражает и не практично).

код для использования обычного оверлея:

import java.util.ArrayList;
import org.osmdroid.DefaultResourceProxyImpl;
import org.osmdroid.ResourceProxy;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.util.constants.MapViewConstants;

import android.app.Activity;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Toast;

public class OnlineTracking extends Activity implements LocationListener, MapViewConstants 
{
    private MapView mMapView; 
    private MapController mapController; 
    private LocationManager mLocMgr; 
    private ItemizedOverlay<OverlayItem> mMyLocationOverlay; 
    private ResourceProxy mResourceProxy; 

ArrayList<OverlayItem> items;

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); 
    setContentView(R.layout.main); 
    initilaizeMap();
    mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
    mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 3, this);      
} 

public void initilaizeMap()
{
    mMapView = (MapView) this.findViewById(R.id.mapView); 
    mMapView.setTileSource(TileSourceFactory.MAPNIK); 
    //mMapView.setUseDataConnection(false);
    mMapView.setBuiltInZoomControls(true); 
    mMapView.setMultiTouchControls(true); 
    mapController = this.mMapView.getController(); 
    mapController.setZoom(15); 
    mapController.setCenter(new GeoPoint(15.610762,32.540345));  
}

public void displayLocation(GeoPoint loc)
{
    //mapController.setCenter(loc);
    items = new ArrayList<OverlayItem>(); 
    // Put overlay icon a little way from map center
    items.add(new OverlayItem("Here you are", "we will keep track of you", loc));
    /* OnTapListener for the Markers, shows a simple Toast. */ 
    this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items, 
            new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { 
                @Override 
                public boolean onItemSingleTapUp(final int index, 
                        final OverlayItem item) { 
                    Toast.makeText( 
                            OnlineTracking.this, 
                            "single tap" + item.mTitle, Toast.LENGTH_LONG).show(); 
                    return true; // We 'handled' this event. 
                } 
                @Override 
                public boolean onItemLongPress(final int index, 
                        final OverlayItem item) { 
                    Toast.makeText( 
                            OnlineTracking.this,  
                            "longPress '" + item.mTitle ,Toast.LENGTH_LONG).show(); 
                    return false; 
                } 
            }, mResourceProxy); 
    mMapView.getOverlays().clear();
    this.mMapView.getOverlays().add(this.mMyLocationOverlay); 
    //mMapView.invalidate();
}

public void onLocationChanged(Location location)
{ 
    int lat = (int) (location.getLatitude() * 1E6); 
    int lng = (int) (location.getLongitude() * 1E6); 
    GeoPoint gpt = new GeoPoint(lat, lng); 
    displayLocation(gpt);
} 

@Override 
public void onProviderDisabled(String arg0) {} 

@Override 
public void onProviderEnabled(String provider) {} 

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

1 ответ

Кажется, это не ошибка разработчика. Я попытался запустить следующий пример проекта, который использует osmdroid:

http://android-er.blogspot.it/2012/06/add-mylocationoverlay-on-openstreetmap.html

На эмуляторе под управлением Android 2.2 я получаю черный экран в начале MyLocationOverlay создается экземпляр. Я попытался запустить тот же проект под эмулированным устройством с теми же характеристиками, но под управлением Android 4.2, и это сработало.

Я действительно не могу объяснить, почему это происходит, в моем случае я решил использовать традиционный подход и типичный ItemizedIconOverlay

Другие вопросы по тегам