Android y OSM

Estaba jugando un poco con Android y OpenStreetMap y salio esta pequeña aplicación que te muestra la ubicación donde te encontrás. Utiliza el GPS del teléfono.

OBS:

  • La versión utilizada es Android 2.3.3
  • Si quieren probar la aplicación descarguen abajo donde dice OpenStreetMap apk.

Descargar 1: Código fuente
Descargar 2: OpenStreetMap apk

(Visited 612 times, 1 visits today)

Comments

comments


Comments

  1. Hola, me aparece la típica exclamación roja, como que falta alguna librería, cuál debería añadir? Gracias.

  2. Hola, gracias por contestar. Corrijo el error añadiendo las librerías que me dices pero la aplicación sigue sin arrancar. De hecho tampoco me va el apk. Tengo 2 móviles viejos para probarlas (2.1 y 2.3.6). Debería valerme al menos con el segundo, no?

  3. public class AndroidOpenStreetMapViewActivity extends Activity{
    // Objetos
    private MapView openMapView;
    private MapController mapController;

    LocationManager locationManager;
    ArrayList overlayItemArray;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    openMapView = (MapView) findViewById(R.id.openmapview);
    openMapView.setBuiltInZoomControls(true);

    // MultiTouch activado.
    openMapView.setMultiTouchControls(true);

    mapController = openMapView.getController();
    mapController.setZoom(14);

    // Crear el Overlay
    overlayItemArray = new ArrayList();

    DefaultResourceProxyImpl defaultResourceProxyImpl = new DefaultResourceProxyImpl(this);
    MyItemizedIconOverlay myItemizedIconOverlay = new MyItemizedIconOverlay(overlayItemArray, null, defaultResourceProxyImpl);
    openMapView.getOverlays().add(myItemizedIconOverlay);

    locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

    // getLastKnownLocation desde GPS, y no del NETWORK.
    Location lastLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    if(lastLocation != null){
    updateLoc(lastLocation);
    }

    // Agregar un scale bar.
    ScaleBarOverlay myscaleBarOverlay = new ScaleBarOverlay(this);
    openMapView.getOverlays().add(myscaleBarOverlay);
    } // Fin del metodo onCreate.

    @Override
    protected void onResume(){
    super.onResume();
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLocationListener);
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, myLocationListener);
    }

    @Override
    protected void onPause(){
    super.onPause();
    locationManager.removeUpdates(myLocationListener);
    }

    private void updateLoc(Location loc){
    GeoPoint locGeoPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude());
    mapController.setCenter(locGeoPoint);

    setOverlayLoc(loc);
    openMapView.invalidate();
    }

    private void setOverlayLoc(Location overlayloc){
    GeoPoint overlocGeoPoint = new GeoPoint(overlayloc);

    overlayItemArray.clear();

    OverlayItem newMyLocationItem =new OverlayItem(«Mi localización es: «, «Mi localización es: «, overlocGeoPoint);
    overlayItemArray.add(newMyLocationItem);
    }

    private LocationListener myLocationListener = new LocationListener(){
    @Override
    public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    updateLoc(location);
    }

    @Override
    public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub
    }

    @Override
    public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub
    }
    };

    // Clase Privada
    private class MyItemizedIconOverlay extends ItemizedIconOverlay{
    public MyItemizedIconOverlay(
    List pList,
    org.osmdroid.views.overlay.ItemizedIconOverlay.OnItemGestureListener pOnItemGestureListener,
    ResourceProxy pResourceProxy) {
    super(pList, pOnItemGestureListener, pResourceProxy);
    // TODO Auto-generated constructor stub
    }
    @Override
    public void draw (Canvas canvas, MapView mapview, boolean arg2){
    super.draw(canvas, mapview, arg2);

    if(!overlayItemArray.isEmpty()){
    // El overlayItemArray contiene un solo elemento.
    GeoPoint in = overlayItemArray.get(0).getPoint();
    Point out = new Point();
    mapview.getProjection().toPixels(in, out);

    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_menu_mylocation);
    canvas.drawBitmap(bm, out.x – bm.getWidth() / 2, out.y – bm.getHeight() / 2, null);
    }
    }
    @Override
    public boolean onSingleTapUp(MotionEvent event, MapView mapView) {
    return true;
    }
    }
    } // Fin de la actividad AndroidOpenStreetMapViewActivity.

    Aquí te lo dejo, muchas gracias por la ayuda.

    1. Ya encontré el problema. El código está bien.
      Entra a propiedades de tu proyecto. Luego andate a Java Build Path -> Pestaña Libraries y agrega los jar que están en la carpeta libs (osmdroid-android-3.0.8.jar y slf4j-android-1.5.8.jar)
      Luego andate a la Pestaña Order and Export y selecciona los dos jar que recien importaste (osmdroid-android-3.0.8.jar y slf4j-android-1.5.8.jar).
      Luego presiona OK.
      Por último en tu manifest agrega este permiso.

      Probé en mi samsung galaxy nexus con android 4.2.2.
      Cualquier cosa, avisame que estoy a tus ordenes.
      Saludos, jose

  4. Funciona!!!!

    Al final también me hacía falta un permiso que no incluía tu app: android:name=»com.proyectosbeta.openstreetmap2.permission.MAPS_RECEIVE».

    Pero por lo demás va genial, Dios te lo pague con una buena mujer, 2 millones de gracias!

  5. Hola antes que nada gracias por compartir, tengo una duda ¿Qué librerías usas? , bueno paquetes y otra duda: ¿Cómo muestras tu posición en el mapa utilizando una etiqueta o figura (por asi decir)? Muchas gracias.

    1. Las librerías que utilizo son: osmdroid-android-3.0.8 y slf4j-android-1.5.8.
      Para mostrar la posición y mostrar el icono esta en esta función:

      private void updateLoc(Location loc){
      GeoPoint locGeoPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude());
      mapController.setCenter(locGeoPoint);

      setOverlayLoc(loc);
      openMapView.invalidate();
      }

      saludos, jose

  6. Hola, sé que ha pasado un tiempo y quizás no lo leas, pero por si acaso:

    OpenStreetMap me funcionaba en su día pero por A o por B lo tuve que dejar aparcado. Ahora que he vuelto con ello veo que los mapas ya no son visibles y el logcat me dice:

    problem downloading maptile http response 403 forbidden

    Mirando por internet parece que han cortado el grifo. Es cierto? O simplemente ahora se saca el mapa de otra forma? Gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *