Android: обратное геокодирование – getFromLocation

Я пытаюсь получить адрес на основе long / lat. похоже, что-то вроде этого должно работать?

Geocoder myLocation = Geocoder(Locale.getDefault()); List myList = myLocation.getFromLocation(latPoint,lngPoint,1); 

Проблема в том, что я продолжаю получать: метод Geocoder (Locale) не определен для типа savemaplocation

Любая помощь будет полезна. Спасибо.


Спасибо, я попробовал контекст, сначала установил его, и это не сработало, и посмотрел на некоторые из других конструкторов (я видел тот, который упомянул только локаль). Несмотря на,

Это не сработало, поскольку я все еще получаю: метод Geocoder (Context, Locale) не определен для типа savemaplocation

У меня есть: import android.location.Geocoder;

Следующий fragment кода делает это для меня (lat и lng – это двойники, объявленные выше этого бита):

 Geocoder geocoder = new Geocoder(this, Locale.getDefault()); List
addresses = geocoder.getFromLocation(lat, lng, 1);

Вот полный пример кода с использованием Thread и Handler, чтобы получить ответ Geocoder, не блокируя пользовательский интерфейс.

Процедура вызова геокодера, может быть расположена в classе Helper

 public static void getAddressFromLocation( final Location location, final Context context, final Handler handler) { Thread thread = new Thread() { @Override public void run() { Geocoder geocoder = new Geocoder(context, Locale.getDefault()); String result = null; try { List
list = geocoder.getFromLocation( location.getLatitude(), location.getLongitude(), 1); if (list != null && list.size() > 0) { Address address = list.get(0); // sending back first address line and locality result = address.getAddressLine(0) + ", " + address.getLocality(); } } catch (IOException e) { Log.e(TAG, "Impossible to connect to Geocoder", e); } finally { Message msg = Message.obtain(); msg.setTarget(handler); if (result != null) { msg.what = 1; Bundle bundle = new Bundle(); bundle.putString("address", result); msg.setData(bundle); } else msg.what = 0; msg.sendToTarget(); } } }; thread.start(); }

Вот призыв к этой процедуре Geocoder в вашем пользовательском интерфейсе:

 getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler()); 

И обработчик, чтобы показать результаты в пользовательском интерфейсе:

 private class GeocoderHandler extends Handler { @Override public void handleMessage(Message message) { String result; switch (message.what) { case 1: Bundle bundle = message.getData(); result = bundle.getString("address"); break; default: result = null; } // replace by what you need to do myLabel.setText(result); } } 

Не забудьте сделать следующее разрешение в вашем Manifest.xml

  

Похоже, здесь происходят две вещи.

1) Вы пропустили new ключевое слово перед вызовом конструктора.

2) Параметр, который вы передаете конструктору Geocoder, неверен. Вы проходите в Locale где ожидаете Context .

Существует два конструктора Geocoder , для которых требуется Context , а также для Locale :

 Geocoder(Context context, Locale locale) Geocoder(Context context) 

Решение

Измените свой код, чтобы перейти в действительный контекст и включите его, и вы должны быть добрым.

 Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); List
myList = myLocation.getFromLocation(latPoint, lngPoint, 1);

Заметка

Если у вас по-прежнему возникают проблемы, это может быть проблема с разрешением. Геокодирование неявно использует Интернет для выполнения поиска, поэтому вашему приложению потребуется тэг-использование INTERNET в вашем манифесте.

Добавьте в узел manifest узла – узел разрешений.

  

Причиной этого является несуществующая служба Backend:

Для classа Geocoder требуется бэкэнд-сервис, который не входит в основную инфраструктуру Android. Методы запросов Geocoder возвратят пустой список, если на платформе нет бэкэнд-сервиса.

Сначала получите Широта и долготу, используя class Location и LocationManager. Теперь попробуйте код ниже для получения информации о городе, адресе

 double latitude = location.getLatitude(); double longitude = location.getLongitude(); Geocoder gc = new Geocoder(this, Locale.getDefault()); try { List
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.getLocality()).append("\n"); sb.append(address.getPostalCode()).append("\n"); sb.append(address.getCountryName()); }

Информация о городе теперь находится в sb. Теперь преобразуем sb в String (используя sb.toString ()).

Ну, я все еще в тупике. Так вот больше кода.

Прежде чем оставить свою карту, я вызываю SaveLocation(myMapView,myMapController); Это то, что в конечном итоге вызывает мою геокодирование информации.

Но поскольку getFromLocation может генерировать IOException , мне пришлось сделать следующее, чтобы вызвать SaveLocation

 try { SaveLocation(myMapView,myMapController); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Затем я должен изменить SaveLocation, сказав, что он выбрасывает IOExceptions:

  public void SaveLocation(MapView mv, MapController mc) throws IOException{ //I do this : Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); List myList = myLocation.getFromLocation(latPoint, lngPoint, 1); //... } 

И он падает каждый раз.

Я слышал, что Geocoder находится на багги. Недавно я собрал пример приложения, которое использует службу геокодирования HTTP Google для поиска местоположения с lat / long. Вы можете проверить здесь

http://www.smnirven.com/?p=39

Использовать это

 Geocoder geocoder = new Geocoder(this, Locale.getDefault()); List
addresses = geocoder.getFromLocation(lat, lng, 1);
Давайте будем гением компьютера.