2010-01-18 36 views
7

我正在编写一个需要获取当前地图位置的应用程序。我的地图文件可以自行工作,但我需要从另一个Activity获取地址(请参阅下面的addressString)。我试过getAddress/setAddress(setters/getters)。他们不工作。他们总是返回“无地址”(默认)。获取地图或位置Android中的地址

这里是我的代码...

我怎样才能使这个独立的Java类???或从另一个活动获取地址?

非常感谢。

此代码自行工作。


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

您是否收到任何错误?因为你拥有的代码是绝对正确的,所以我已经在我的应用程序中使用过,并为我工作得很好。如果你有一些错误,请发布错误日志。 – Scorpion 2012-03-08 06:23:33

+0

Geocoder gc = new Geocoder(this,Locale.getDefault());而不是这个请试试这个。 Geocoder gc = new Geocoder(youractivityclassname.this.getApplicationContext(),Locale.getDefault()); – Scorpion 2012-03-08 06:25:56

回答

0

无论是地址传递给你的第二个ActivityIntent,或者如果你需要从你的第二个Activity做查询,只需拨打Geocoder从那里。

如果您想从第二个Activity实例化上述类(GetMapActivity)并调用getAddress方法,那么这将不起作用。

0

下可能会奏效[代码从的onCreate移动,把它放在一个方法]

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

我用下面的代码在我的应用程序和它的工作对我来说绝对没问题。尝试这个。希望这会帮助你。

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

这会抛出“未找到Google Play服务资源,请检查您的项目配置以确保资源已包含在内。” – alicanbatur 2014-03-13 14:26:57

+0

它适合我! – Coeus 2015-11-20 20:37:01