Android обратное геокодирование getLocality возвращает часто null

Я использую Android Geocoding, чтобы получить текущий город с помощью метода Address.getLocality(). Он работал нормально, и до недавнего времени он часто возвращал null для местоположения. Вот пример:

    try {
        Geocoder c = new Geocoder(this, Locale.getDefault());
        double lat = 51.481;
        double lon = 0.0;
        List<Address> l = c.getFromLocation(lat, lon, 5);
        for (Address a: l) {
            Log.i("GeocoderTest", "Locality " + a.getLocality() + " (" + a + ")");
        }
    } catch (IOException e) {
        Log.e("GeocoderTest", "", e);
    }

Теперь для журнала будет отправлено следующее сообщение:

Локальность null (Адрес [адресLines = [0: "14-18 Park Vista", 1: "Лондон Город Гринвич, Лондон SE10", 2: "UK" ], функция =, админ = NULL, суб-админ = NULL, местонахождение = нуль, проездом = Park Виста, PostalCode = нуль, COUNTRYCODE = GB, COUNTRYNAME = United Великобритания, hasLatitude = верно, широта = 51.4819069, hasLongitude = истина, долгота = -6.327E-4, телефон = нуль, URL = нуль, дополнительные = NULL])

Некоторые местоположения возвращают город в местности, а рядом с ним нет.

Таким образом, он работал очень хорошо раньше, на самом деле я раньше не видел нулевой локали. Поэтому, я думаю, что-то должно измениться в службе геокодирования Google. Любая идея, что происходит, и является ли эта ситуация постоянной? Если да, то каким будет лучший способ определить город из местоположения?

Ответы

Ответ 1

Сейчас я живу в Канаде, Онтарио, Гамильтон (Гамильтон - мой город, Онтарио - провинция)

Я заметил, что getLocality() возвращает null, а getAdminArea() возвращает Ontario, а getSubLocality() возвращает Hamilton. ч

Ответ 2

Я заметил, что очень часто getLocality() возвращает null для первого адреса в списке, возвращаемого Geocoder.
С другой стороны, правильное название города остается в Местности следующего адреса.
Поэтому я использую этот способ обхода и хорошо работает для больших городов:

 private String getCityNameByCoordinates(double lat, double lon) throws IOException {
    List<Address> addresses = mGeocoder.getFromLocation(lat, lon, 10);
    if (addresses != null && addresses.size() > 0) {
        for (Address adr : addresses) {
            if (adr.getLocality() != null && adr.getLocality().length() > 0) {
                return adr.getLocality();
            }
        }
    }
    return null;
}