在Android中获取地图地址或位置地址

时间:2010-01-18 05:32:33

标签: java android google-maps

我正在编写一个需要获取当前地图位置的应用。我的Map文件可以正常工作,但我需要从另一个addressString获取地址(请参阅下面的Activity)。我尝试了getAddress / setAddress(setters / getters)。它们不起作用。他们总是返回'无地址'(默认)。

这是我的代码......

如何将其作为独立的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;
    }
}

4 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:0)

将地址传递给Activity中的第二个Intent,或者如果您需要从第二个Activity进行查找,只需从那里拨打Geocoder。< / p>

如果您以某种方式从第二个GetMapActivity实例化上述类(Activity)并调用getAddress方法,则无效。

答案 2 :(得分: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;
    }

答案 3 :(得分:0)