Сервис Google Geocoder недоступен (координаты по адресу)

Мне нужно получить адрес по координатам, но он не работает и выводит "Не удалось получить адрес":

public String GetAddress(String lat, String lon)
        {
            Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
            String ret = "";
            try {
                List<Address> addresses = geocoder.getFromLocation(Double.parseDouble(lat), Double.parseDouble(lon), 1);
                if(addresses != null) {
                    Address returnedAddress = addresses.get(0);
                    StringBuilder strReturnedAddress = new StringBuilder("");
                    for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++) {
                        strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
                    }
                    ret = strReturnedAddress.toString();
                    ret=ret.substring(0, ret.length() - 1);
                }
                else{
                    ret = "Unknown Address";
                }
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                ret = "Couldn't get Address";
            }
            return ret;
        }

Логкат:

09-27 23:47:49.837: W/System.err(1862): java.io.IOException: Service not Available
09-27 23:47:49.847: W/System.err(1862):     at android.location.Geocoder.getFromLocation(Geocoder.java:136)
09-27 23:47:49.847: W/System.err(1862):     at com.example.free.Add.GetAddress(Add.java:634)
09-27 23:47:49.857: W/System.err(1862):     at com.example.free.Add$LoadAddress.doInBackground(Add.java:608)
09-27 23:47:49.857: W/System.err(1862):     at com.example.free.Add$LoadAddress.doInBackground(Add.java:1)
09-27 23:47:49.857: W/System.err(1862):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-27 23:47:49.857: W/System.err(1862):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-27 23:47:49.857: W/System.err(1862):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-27 23:47:49.857: W/System.err(1862):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-27 23:47:49.857: W/System.err(1862):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-27 23:47:49.857: W/System.err(1862):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-27 23:47:49.857: W/System.err(1862):     at java.lang.Thread.run(Thread.java:856)

person Npv23g    schedule 27.09.2013    source источник
comment
stackoverflow.com/questions/7109240/   -  person nhgrif    schedule 28.09.2013
comment
Извините меня. странная проблема..   -  person Npv23g    schedule 28.09.2013
comment
Вы перешли по этой ссылке?   -  person nhgrif    schedule 28.09.2013
comment
Я думаю, что более важный вопрос ... ПОЧЕМУ это внезапно перестало работать? У меня это работало нормально 2 недели назад, и только во время регрессионного тестирования оно было поднято. Как может вся служба просто перестать работать. Должны ли быть приложения в открытом доступе, которые теперь в корне сломаны? Если это вопрос уровня подписки или превышения разрешенного использования, то эта информация должна быть возвращена из службы.   -  person ComeIn    schedule 08.06.2016


Ответы (1)


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

Конечно, вы не можете сказать своим пользователям перезагрузить устройство, чтобы ваше приложение заработало, поэтому я решил использовать резервный вариант HTTP, вот AsyncTask, который я использую в своем коде.

Вам придется изменить его для вашей ситуации, так как я ищу адрес из положения, а не наоборот.

    private class GetAddressPositionTask extends
        AsyncTask<String, Integer, LatLng> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected LatLng doInBackground(String... plookupString) {

        String lookupString = plookupString[0];
        final String lookupStringUriencoded = Uri.encode(lookupString);
        LatLng position = null;

        // best effort zoom
        try {
            if (geocoder != null) {
                List<Address> addresses = geocoder.getFromLocationName(
                        lookupString, 1);
                if (addresses != null && !addresses.isEmpty()) {
                    Address first_address = addresses.get(0);
                    position = new LatLng(first_address.getLatitude(),
                            first_address.getLongitude());
                }
            } else {
                Log.e(TAG, "geocoder was null, is the module loaded? "
                        + isLoaded);
            }

        } catch (IOException e) {
            Log.e(TAG, "geocoder failed, moving on to HTTP");
        }
        // try HTTP lookup to the maps API
        if (position == null) {
            HttpGet httpGet = new HttpGet(
                    "http://maps.google.com/maps/api/geocode/json?address="
                            + lookupStringUriencoded + "&sensor=true");
            HttpClient client = new DefaultHttpClient();
            HttpResponse response;
            StringBuilder stringBuilder = new StringBuilder();

            try {
                response = client.execute(httpGet);
                HttpEntity entity = response.getEntity();
                InputStream stream = entity.getContent();
                int b;
                while ((b = stream.read()) != -1) {
                    stringBuilder.append((char) b);
                }
            } catch (ClientProtocolException e) {
            } catch (IOException e) {
            }

            JSONObject jsonObject = new JSONObject();
            try {
                // Log.d("MAPSAPI", stringBuilder.toString());

                jsonObject = new JSONObject(stringBuilder.toString());
                if (jsonObject.getString("status").equals("OK")) {
                    jsonObject = jsonObject.getJSONArray("results")
                            .getJSONObject(0);
                    jsonObject = jsonObject.getJSONObject("geometry");
                    jsonObject = jsonObject.getJSONObject("location");
                    String lat = jsonObject.getString("lat");
                    String lng = jsonObject.getString("lng");

                    // Log.d("MAPSAPI", "latlng " + lat + ", "
                    // + lng);

                    position = new LatLng(Double.valueOf(lat),
                            Double.valueOf(lng));
                }

            } catch (JSONException e) {
                Log.e(TAG, e.getMessage(), e);
            }

        }
        return position;
    }

    @Override
    protected void onPostExecute(LatLng result) {
        Log.i("GEOCODE", result.toString());
        super.onPostExecute(result);
    }

};
person cYrixmorten    schedule 27.09.2013
comment
Это просто строка поиска, закодированная uri (пробелы заменены на %20 и т. д.). Я использую его в резервной копии HTTP для параметра запроса. - person cYrixmorten; 27.02.2014
comment
Вероятно, не стоит сначала пытаться вызвать API, учитывая, что он, как известно, ненадежный. Просто используйте HTTP. Вы не хотите, чтобы пользователь зависал в ожидании тайм-аута соединения до того, как ваше приложение сделает http-вызов. - person ComeIn; 07.06.2016
comment
@ComeIn Действительная точка, однако сбой происходит мгновенно, поэтому задержка не возникает. Если вы сейчас работаете над геокодированием, я участвовал в этом проекте: github.com/mcharmas/ Android-ReactiveLocation, где недавно также был реализован резервный вариант HTTP. - person cYrixmorten; 08.06.2016