Visitas: 129
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
El código tenia un problema de permisos. Ya esta solucionado y levante correctamente el código fuente cómo también el apk.
Muchas Gracias Seba por avisar y probar en tu smartPhone.
saludo, jose
Gracias por compartir el código, ahora lo voy a probar.
Hola, me aparece la típica exclamación roja, como que falta alguna librería, cuál debería añadir? Gracias.
Juan: en el código que compartí en la carpeta libs están dos librerías llamadas: osmdroid-android-3.0.8 y slf4j-android-1.5.8. Esas dos importa y te tendrá que andar. Cualquier cosa, estamos a tus ordenes.
Saludos, jose
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?
pero que error te sale? así veo si podemos ayudarte. Mira en el log, para ver que te indica.
saludos, jose
probaste el apk instalar?te funciona en tu dispositivo?
Con la apk me sale el mapa en cuadrícula y la guía de las medidas en el mapa (tengo wifi y gps activados).
Si ejecuto el código me sale lo siguiente:
http://img185.imagevenue.com/img.php?image=934612237_captura_122_569lo.jpg
ahh. y necesitaría ver el código para ver el error. Me podrías mandar el código o subir en internet. Así veo y te ayudo.
saludos, jose
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.
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
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!
que suerte que te anduvo. Espero leerte más en los comentarios.
Saludos, José
El permiso que falta es
Ya agregue en el código fuente para que se tenga correctamente.
saludos, jose
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.
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
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.