Ответ 1
Следующий фрагмент кода делает это для меня (lat и lng - это удваивания, объявленные выше этого бита):
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
Я пытаюсь получить адрес на основе long/lat. похоже, что-то вроде этого должно работать?
Geocoder myLocation = Geocoder(Locale.getDefault());
List myList = myLocation.getFromLocation(latPoint,lngPoint,1);
Проблема в том, что я продолжаю получать: метод Geocoder (Locale) undefined для типа savemaplocation
Любая помощь будет полезна. Спасибо.
Спасибо, я попробовал контекст, сначала установил локаль, и это не сработало, и посмотрел на некоторые из других конструкторов (я видел тот, который упомянул только локаль). Независимо от того,
Это не сработало, поскольку я все еще получаю: метод Geocoder (Context, Locale) undefined для типа savemaplocation
У меня есть: import android.location.Geocoder;
Следующий фрагмент кода делает это для меня (lat и lng - это удваивания, объявленные выше этого бита):
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
Вот полный примерный код с использованием Thread и Handler, чтобы получить ответ Geocoder, не блокируя пользовательский интерфейс.
Процедура вызова геокодера, может быть расположена в классе помощника
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<Address> 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();
}
Вот вызов этой процедуры геокодирования в вашем пользовательском интерфейсе:
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
<uses-permission android:name="android.permission.INTERNET" />
Похоже, здесь происходят две вещи.
1) Вы пропустили ключевое слово new
перед вызовом конструктора.
2) Параметр, который вы передаете конструктору геокодирования, неверен. Вы передаете Locale
, где ожидаете Context
.
Существует два конструктора Geocoder
, оба из которых требуют Context
, а также принимают Locale
:
Geocoder(Context context, Locale locale)
Geocoder(Context context)
Решение
Измените свой код для передачи в допустимом Контексте и включите new
, и вам должно быть хорошо, чтобы идти.
Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());
List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
Примечание
Если у вас все еще возникают проблемы, это может быть проблема с правами доступа. Геокодирование неявно использует Интернет для выполнения поиска, поэтому вашему приложению потребуется тэг INTERNET
uses-permission в вашем манифесте.
Добавьте следующие объявления-разрешения node в manifest
node вашего манифеста.
<uses-permission android:name="android.permission.INTERNET" />
Причиной этого является несуществующая служба Backend:
Для класса Geocoder требуется бэкэнд-сервис, который не входит в основную инфраструктуру Android. Методы запросов Geocoder возвратят пустой список, если на платформе нет бэкэнд-сервиса.
Сначала выберите Локатор и Долгота, используя класс Location и LocationManager. Теперь попробуйте код ниже для получения города, адресной информации
double latitude = location.getLatitude();
double longitude = location.getLongitude();
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.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 находится на багги. Недавно я собрал пример приложения, которое использует службу геокодирования Google http для поиска по местоположению с lat/long. Здесь вы можете проверить здесь.
Используйте этот
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);