在 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 中获取地图地址或位置地址的主要内容,如果未能解决你的问题,请参考以下文章