2010-01-18 17 views
7

Sto scrivendo un app che richiede per ottenere la posizione corrente della mappa. My Map file funziona bene da esso stesso, ma ho bisogno di ottenere l'indirizzo (vedi addressString sotto al buttom) da un altro Activity. Ho provato getAddress/setAddress (setter/getter). Loro non lavorano. Restituiscono sempre "nessun indirizzo" (predefinito).Ottenere indirizzo Map o Località Indirizzo in Android

Ecco il mio codice ...

Come posso fare questo una classe Java standalone ??? O ottieni l'indirizzo da un'altra attività?

Grazie mille.

questo codice funziona da solo.

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

State ottenendo qualche errore? Perché il codice che hai è assolutamente giusto, ho usato nella mia app e funziona bene per me. Se hai qualche errore per favore pubblica il log degli errori. – Scorpion

+0

Geocoder gc = new Geocoder (this, Locale.getDefault()); invece di questo per favore prova questo. Geocoder gc = new Geocoder (youractivityclassname.this.getApplicationContext(), Locale.getDefault()); – Scorpion

risposta

0

passare l'indirizzo al secondo Activity nel Intent, o se avete bisogno di fare ricerche dal vostro secondo Activity, basta chiamare Geocoder da lì.

Se in qualche modo si istanzia la suddetta classe() dal secondo Activity e si chiama il metodo getAddress, non funzionerà.

0

Quanto segue potrebbe funzionare [spostare il codice dal onCreate e metterlo in un metodo]

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

Ho usato il seguente codice nella mia app e il suo lavoro assolutamente bene per me. Prova questo. Spero che questo ti possa aiutare.

// 
    // 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

questo genera "Le risorse dei servizi di Google Play non sono state trovate. Controlla la configurazione del tuo progetto per assicurarti che le risorse siano incluse." – alicanbatur

+0

funziona per me! – Coeus