2010-01-18 17 views
7

Estoy escribiendo una aplicación que requiere obtener la ubicación actual del mapa. El archivo My Map funciona bien solo, pero necesito obtener la dirección (ver addressString debajo en el botón) de otro Activity. Intenté getAddress/setAddress (setters/getters). No funcionan. Siempre devuelven 'no address' (el valor predeterminado).Obtener la dirección del mapa o la dirección de la ubicación en Android

Aquí está mi código ...

¿Cómo puedo hacer esto una clase Java independiente ??? ¿O obtener la dirección de otra actividad?

Muchas gracias.

Este código funciona por sí mismo.

Mat


import android.content.Context; 
import android.location.Address; 
import android.location.Criteria; 
import android.location.Geocoder; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.widget.TextView; 

import java.io.IOException; 
import java.util.List; 
import java.util.Locale; 

public class GetMapAddress extends MapActivity { 

    MapController mapController; 

    MyPositionOverlay positionOverlay; 

    MapController mc; 

    GeoPoint p; 

    String addressString = "No address found"; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.map); 

     MapView myMapView = (MapView) findViewById(R.id.myMapView); 
     mapController = myMapView.getController(); 

     // Configure the map display options 
     myMapView.setSatellite(true); 
     myMapView.setStreetView(true); 

     // Zoom in 
     mapController.setZoom(17); 

     myMapView.setBuiltInZoomControls(true); 

     // Add the MyPositionOverlay 
     positionOverlay = new MyPositionOverlay(); 
     List<Overlay> overlays = myMapView.getOverlays(); 
     overlays.add(positionOverlay); 

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

     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 = locationManager.getBestProvider(criteria, true); 

     Location location = locationManager.getLastKnownLocation(provider); 

     updateWithNewLocation(location); 

     locationManager.requestLocationUpdates(provider, 2000, 10, locationListener); 

     mc = myMapView.getController(); 
     String coordinates[] = { 
      "1.352566007", "103.78921587" 
     }; 
     double lat = Double.parseDouble(coordinates[0]); 
     double lng = Double.parseDouble(coordinates[1]); 

     p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 

     mc.animateTo(p); 
     mc.setZoom(17); 
     myMapView.invalidate(); 

    } 

    private final LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      updateWithNewLocation(location); 
     } 

     public void onProviderDisabled(String provider) { 
      updateWithNewLocation(null); 
     } 

     public void onProviderEnabled(String provider) { 
     } 

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

    /** Update the map with a new location */ 
    private void updateWithNewLocation(Location location) { 
     TextView myLocationText = (TextView) findViewById(R.id.myLocationText); 

     String latLongString; 

     if (location != null) { 
      // Update my location marker 
      positionOverlay.setLocation(location); 

      // Update the map location. 
      Double geoLat = location.getLatitude() * 1E6; 
      Double geoLng = location.getLongitude() * 1E6; 
      GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue()); 

      mapController.animateTo(point); 

      double lat = location.getLatitude(); 
      double lng = location.getLongitude(); 
      latLongString = "Lat:" + lat + "\nLong:" + lng; 

      Geocoder gc = new Geocoder(this, Locale.getDefault()); 

      try { 

       List<Address> addresses = gc.getFromLocation(lat, lng, 1); 
       StringBuilder sb = new StringBuilder(); 

       if (addresses.size() > 0) { 
        Address address = addresses.get(0); 

        for (int i = 0; i < address.getMaxAddressLineIndex(); i++) 
         sb.append(address.getAddressLine(i)).append("\n"); 

        sb.append(address.getCountryName()); 
       } 
       addressString = sb.toString(); 
      } catch (IOException e) { 
      } 
     } else { 

      // Place the CellID here 
      latLongString = "No location found"; 

     } 
     // This commented out line will include latitute and longtitute 
     // myLocationText.setText("Your Phone is Currently at.. \n" + latLongString + "\n" + 
     // addressString); 

     myLocationText.setText("Your Phone is Currently at.. \n" + addressString); 
     setAddress(addressString); 

     ; 

    } 

    public void setAddress(String add) { 
     this.addressString = add; 
    } 

    public String getAddress() { 

     return addressString; 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     return false; 
    } 
} 
+0

¿Usted está consiguiendo algún error? Debido a que el código que tiene es absolutamente correcto, lo he usado en mi aplicación y funciona bien para mí. Si tiene algún error, publique el registro de errores. – Scorpion

+0

Geocoder gc = new Geocoder (esto, Locale.getDefault()); en lugar de esto, por favor prueba este. Geocoder gc = new Geocoder (youractivityclassname.this.getApplicationContext(), Locale.getDefault()); – Scorpion

Respuesta

0

Cualquiera de pasar la dirección a su segunda Activity en el Intent, o si lo que necesita hacer operaciones de búsqueda de su segundo Activity, a llamar a Geocoder desde allí.

Si de alguna manera está instanciando la clase anterior (GetMapActivity) desde su segundo Activity y llamando al método getAddress, eso no funcionará.

0

El siguiente podría trabajar [mover el código de onCreate y ponerlo en un método]

public String getAddressString() { 
     if (addressString.equals("default") { 
      LocationManager lm = (LocationManager)act.getSystemService(Context.LOCATION_SERVICE); 
      Criteria crit = new Criteria(); 
      crit.setAccuracy(Criteria.ACCURACY_FINE); 
      String provider = lm.getBestProvider(crit, true); 
      updateWithNewLocation(lm.getLastKnownLocation(provider));    
     } 
     return addressString; 
    } 
10

He utilizado el siguiente código en mi aplicación y su trabajo absolutamente bien para mí. Prueba esto. Espero que esto te ayudará.

// 
    // Write the location name. 
    // 

    try { 

     Geocoder geo = new Geocoder(youractivityclassname.this.getApplicationContext(), Locale.getDefault()); 
     List<Address> addresses = geo.getFromLocation(latitude, longitude, 1); 
     if (addresses.isEmpty()) { 
      yourtextfieldname.setText("Waiting for Location"); 
     } 
     else { 
      if (addresses.size() > 0) { 
       yourtextfieldname.setText(addresses.get(0).getFeatureName() + ", " + addresses.get(0).getLocality() +", " + addresses.get(0).getAdminArea() + ", " + addresses.get(0).getCountryName()); 
       //Toast.makeText(getApplicationContext(), "Address:- " + addresses.get(0).getFeatureName() + addresses.get(0).getAdminArea() + addresses.get(0).getLocality(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); // getFromLocation() may sometimes fail 
    } 
+0

Esto arroja "No se encontraron los recursos de los servicios de Google Play. Revise la configuración de su proyecto para asegurarse de que los recursos estén incluidos". – alicanbatur

+0

¡funciona para mí! – Coeus

Cuestiones relacionadas