Использование геокодера с myLocationOverlay
Я пытаюсь получить текущий почтовый индекс из долготы и широты, которые предоставляет MyLocationOverlay, и установить его в EditView в моей деятельности.
Активность падает, когда я пытаюсь получить долготу и широту от MyLocationOverlay.
Что не так с этим кодом?
С уважением, поплавок
Вывод LogCat: http://codepaste.net/vs6itk Строка 59 - это следующая строка:
double currentLatitude = myLocationOverlay.getMyLocation().getLatitudeE6();
Вот мой код:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.partner_suche);
final EditText tView = (EditText) findViewById(R.id.editTextPLZ);
final MapView mView = (MapView) findViewById(R.id.mapview);
mView.getController().setZoom(14);
List<Overlay> mapOverlays = mView.getOverlays();
myLocationOverlay = new MyCustomLocationOverlay(this, mView);
mapOverlays.add(myLocationOverlay);
myLocationOverlay.enableMyLocation();
myLocationOverlay.enableCompass();
myLocationOverlay.runOnFirstFix(new Runnable() {
public void run() {
mView.getController().animateTo(myLocationOverlay.getMyLocation());
}
});
Geocoder gc = new Geocoder(this, Locale.getDefault());
double currentLatitude = myLocationOverlay.getMyLocation().getLatitudeE6();
double currentLongitute = myLocationOverlay.getMyLocation().getLongitudeE6();
try
{
List<Address> addresses = gc.getFromLocation(currentLatitude, currentLongitute, 1);
if (addresses.size() > 0)
{
tView.setText(addresses.get(0).getLocality());
}
} catch (IOException e)
{
}
}
РЕДАКТИРОВАТЬ: я создал LocationListener, чтобы получить мое текущее местоположение. Теперь часть падает, где я пытаюсь запустить gc.getFromLocation (широта, долгота, 1); Я не могу прочитать Исключение?:/
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);
String provider = LocationManager.GPS_PROVIDER;
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){ }
};
locationManager.requestLocationUpdates(provider, 0, 0, locationListener);
private void updateWithNewLocation(Location location) {
final EditText tView = (EditText) findViewById(R.id.editTextPLZ);
double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder gc = new Geocoder(this, Locale.getDefault());
if (location != null) {
try
{
List<Address> addresses = gc.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0)
{
Address address = addresses.get(0);
for (int i = 0; i < address.getMaxAddressLineIndex(); i++){
tView.setText(address.getPostalCode());
}
}
} catch (Exception e)
{
}
}
}
2 ответа
Если вы используете эмулятор API уровня 8 или 9 и получаете исключение:
java.io.IOException: Сервис недоступен
тогда это известная ошибка, см. сервис недоступен
Это работает нормально на реальных устройствах и эмуляторе уровня 7, хотя. (Вам, вероятно, следует ставить ловушку на адреса, которые тоже равны нулю, хотя это не заставит геокодер работать!)
Скорее всего, местоположение возвращается из
myLocationOverlay.getMyLocation()
или же
Location location = locationManager.getLastKnownLocation(provider);
нулевой. Вероятно, из-за того, что ваше приложение еще не получило исправления местоположения и ранее не сохраняло местоположения.
Попробуйте переместить блок кода, в котором вы выполняете геокодирование, в свой исполняемый файл, который запускается после получения исправления. Как это:
myLocationOverlay.runOnFirstFix(new Runnable() {
public void run() {
Location loc = myLocationOverlay.getMyLocation();
if (loc != null) {
mView.getController().animateTo(loc);
Geocoder gc = new Geocoder(this, Locale.getDefault());
double currentLatitude = loc.getLatitudeE6();
double currentLongitute = loc.getLongitudeE6();
try
{
List<Address> addresses = gc.getFromLocation(currentLatitude, currentLongitute, 1);
if (addresses.size() > 0)
{
tView.setText(addresses.get(0).getLocality());
}
} catch (IOException e)
{
}
}
}
});