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

Posted

技术标签:

【中文标题】在 Android 中获取地图地址或位置地址【英文标题】:Get Map address or Location Address in Android 【发布时间】:2011-01-06 05:52:19 【问题描述】:

我正在编写一个需要获取当前地图位置的应用程序。我的地图文件可以自己正常工作,但我需要从另一个Activity 获取地址(请参阅下面的addressString)。我试过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;
    

【问题讨论】:

您是否遇到任何错误?因为您拥有的代码绝对正确,所以我已在我的应用程序中使用并且对我来说工作正常。如果您有一些错误,请发布错误日志。 Geocoder gc = new Geocoder(this, Locale.getDefault());而不是这个,请试试这个。 Geocoder gc = new Geocoder(youractivityclassname.this.getApplicationContext(), Locale.getDefault()); 【参考方案1】:

我在我的应用程序中使用了以下代码,它对我来说绝对没问题。尝试这个。希望这会对你有所帮助。

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

【讨论】:

这会抛出“未找到 Google Play 服务资源。请检查您的项目配置以确保包含资源。” 这种方法不可靠,有bug。检查这个:***.com/q/47331480/1397821【参考方案2】:

或者将地址传递给Intent 中的第二个Activity,或者如果您需要从第二个Activity 进行查找,只需从那里调用Geocoder

如果您以某种方式从第二个 Activity 实例化上述类 (GetMapActivity) 并调用 getAddress 方法,那将无法正常工作。

【讨论】:

【参考方案3】:

以下可能有效[将代码从 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;
    

【讨论】:

以上是关于在 Android 中获取地图地址或位置地址的主要内容,如果未能解决你的问题,请参考以下文章

如何在android的地图中获取当前位置?

Android高德通过经纬度获取地理位置

Android - startActivityForResult 获取用户位置?

获取android应用的当前位置地址

怎么用百度地图api自动获取当前位置(谷歌的也行)

从IP地址获取地理位置[重复]