geocoder.getFromLocationName возвращает только null

Последние два дня я схожу с ума из-за ошибки IllegalArgumentException, которую я получаю в коде Android при попытке получить координаты из адреса или даже наоборот, получить адрес из долготы и широты. Это код, но я не вижу ошибки. Это стандартный фрагмент кода, который легко найти в поиске Google.

public GeoPoint determineLatLngFromAddress(Context appContext, String strAddress) {
    Geocoder geocoder = new Geocoder(appContext, Locale.getDefault());
    GeoPoint g = null; 
    try {
        System.out.println("str addres: " + strAddress);
        List<Address> addresses = geocoder.getFromLocationName(strAddress, 5);
        if (addresses.size() > 0) {
            g = new GeoPoint(
               (int) (addresses.get(0).getLatitude() * 1E6),
               (int) (addresses.get(0).getLongitude() * 1E6)
            );
        }
    } catch (Exception e) {
        throw new IllegalArgumentException("locationName == null");
    }
    return g;
 }

Это разрешения из файла manifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

У меня также объявлен ключ Google API: <uses-library android:name="com.google.android.maps" />

Из приведенного выше фрагмента кода geocoder не является null, а также address или appContext, и я спотыкаюсь здесь: geocoder.getFromLocationName(strAddress, 5);

Я много искал в Google и не нашел ничего подходящего, и самая важная информация, которую я нашел, заключается в следующем:

Для класса Geocoder требуется серверная служба, которая не включена в базовую платформу Android.

Сооо, я теперь в замешательстве. Что мне нужно вызывать, импортировать, добавлять, использовать в коде.... чтобы это работало? Я использую Google API 2.2, уровень API 8. Если кто-то нашел решение для этого или указатель на документацию, что-то, чего я не обнаружил, сообщите нам об этом.


person test    schedule 31.12.2010    source источник


Ответы (4)


У меня была аналогичная проблема, и я обнаружил, что опрос геокодера до тех пор, пока я не получу результат, сработал. Вот как я это сделал, пока работает отлично.

try {
    List<Address> geoResults = geocoder.getFromLocationName("<address goes here>", 1);
    while (geoResults.size()==0) {
        geoResults = geocoder.getFromLocationName("<address goes here>", 1);
    }
    if (geoResults.size()>0) {
        Address addr = geoResults.get(0);
        myLocation.setLatitude(addr.getLatitude());
        myLocation.setLongitude(addr.getLongitude());
    }
} catch (Exception e) {
    System.out.print(e.getMessage());
}
person pmko    schedule 09.02.2011
comment
я смог это исправить. я принудительно закрыл приложение карт Android... как только я перезапустил эмулятор. это сработало нормально - person i_raqz; 15.03.2011
comment
Хорошее решение - я установил порог в 10 попыток, чтобы он не попал в бесконечный цикл. Если ничего не помогло, я воспользовался API Карт: developers.google.com/maps/documentation/ геокодирование - person bkurzius; 03.10.2012
comment
Привет, @chris, твой код работает отлично... Я передаю адрес из SearchView на панели действий этому методу, который ты упомянул выше. Что мне интересно, так это то, как я могу показывать предложения по адресу прямо под панелью поиска, как это делает Google. - person Ali Ansari; 13.11.2014
comment
Я попробовал вышеуказанное решение, и произошло много исключений. Есть ли способ, которым вы могли бы мне помочь, если я задам новый вопрос? - person Marialena; 23.02.2015
comment
@AliAnsari, если у вас еще нет решения, проверьте эти ссылки: 1. разработчик .android.com/reference/android/widget/ 2. developers.google. com/places/android-api - person Saurabh Jain; 02.09.2015

Была такая же проблема. Объединение не работало, поэтому я использовал это, чтобы получить местоположение: Ответы геокодирования

Используйте этот класс, чтобы получить JSONObject местоположения:

public class GetLocationDownloadTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... strings) {


        String result = "";
        URL url;
        HttpURLConnection urlConnection;
        try {
            url = new URL(strings[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream is = urlConnection.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(is);

            int data = inputStreamReader.read();
            while(data != -1){
                char curr = (char) data;
                result += curr;
                data = inputStreamReader.read();
            }
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if(result != null) {
            try {
                JSONObject locationObject = new JSONObject(result);
                JSONObject locationGeo = locationObject.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location");


            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }

Вы можете создать и запустить экземпляр класса следующим образом:

String link = "https://maps.googleapis.com/maps/api/geocode/json?address=" + addressString + "&key={YOUR_API_KEY}";

GetLocationDownloadTask getLocation = new GetLocationDownloadTask();

getLocation.execute(link);
person Filip    schedule 16.03.2017

Запустите свой код на Android 2.0, он будет работать. У меня была такая же проблема с майским кодом. В 2.2 не работает, не знаю почему

person Sandy    schedule 31.12.2010
comment
Я попробую это с Android 2.0, спасибо. Надеюсь, это сработает, если да, дам вам знать. С новым годом! - person test; 31.12.2010

person    schedule
comment
В первый раз, если это не дает результата, то даст ли это результат на майские попытки? - person Nigam Patro; 10.02.2016