我正在编写一个需要获取当前地图位置的应用。我的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;
}
}
答案 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)