Обратное геокодирование - Служба недоступна - Перезапуск устройства не решает окончательно - критиковать мое ручное обратное геокодирование

Время от времени я встречаю Service Not Available исключения в своем приложении. В большинстве случаев проблем нет. Но иногда это случается. (Приложение все еще находится в разработке)

Единственный способ решить эту проблему — перезагрузить телефон. Соответствующая проблема 38009 на форумах поддержки. Но из комментариев я понял, что перезагрузка устройства решает проблему навсегда.

Верно ли это?
Потому что в моем случае ошибка может вернуться (частота: думаю, один или два раза в месяц, и я полностью занят этим приложением).

Есть ли способ перезапустить геокодер из приложения?

Единственное решение, которое у меня есть, - это предоставить альтернативное решение на всякий случай, чтобы получить «вручную» адрес, как показано ниже. У вас есть лучше?

    Dbg.d(TAG, "=== address_info FetchLocationTask - doInBackground");
new Thread(new Runnable() {

    @Override
    public void run() {
        Looper.prepare();
        mHandler = new Handler();
        Looper.loop();
    }
}).start();

    /**
     * Implementation of a second method in case of failure:
     * 
     */
    double lat = Double.parseDouble(args[0]);
    double lng = Double.parseDouble(args[1]);
    String address = String.format(Locale.ENGLISH,
            "http://maps.googleapis.com/maps/api/geocode/json?latlng="+Double.toString(lat)+","+Double.toString(lng)+"&sensor=true&language="+Locale.getDefault().getCountry(), lat, lng);
    Dbg.d(TAG, "fetching path : "+ address);


    HttpGet httpGet = new HttpGet(address);
    HttpClient client = new DefaultHttpClient();
    HttpResponse response;
    StringBuilder stringBuilder = new StringBuilder();

    List<Address> retList = null;

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

        JSONObject jsonObject = new JSONObject();
        jsonObject = new JSONObject(stringBuilder.toString());


        retList = new ArrayList<Address>();


        if("OK".equalsIgnoreCase(jsonObject.getString("status"))){
            JSONArray results = jsonObject.getJSONArray("results");
            for (int i=0;i<results.length();i++ ) {
                JSONObject result = results.getJSONObject(i);
                String indiStr = result.getString("formatted_address");
                Address addr = new Address(Locale.ITALY);
                addr.setAddressLine(0, indiStr);
                Dbg.d(TAG, "adresse :"+addr.toString());
                retList.add(addr);
            }
        }


    } catch (ClientProtocolException e) {
        Dbg.e(TAG, "Error calling Google geocode webservice.", e);
    } catch (IOException e) {
        Dbg.e(TAG, "Error calling Google geocode webservice.", e);
    } catch (JSONException e) {
        Dbg.e(TAG, "Error parsing Google geocode webservice response.", e);
    }

    JSONObject jObj = new JSONObject();

    boolean found = false;

    if (retList.size() > 0) {

        Address a = retList.get(0);

        String name = a.getAddressLine(0);
        String city = a.getLocality();
        String postalCode = a.getPostalCode();
        String country = a.getCountryName();

        if (!TextUtils.isEmpty(name)) {
            JsonUtils.setSringInJson(jObj, BookLocation.ADDRESS_NAME_KEY, name);
            found = true;
        }
        if (!TextUtils.isEmpty(postalCode)) {
            JsonUtils.setSringInJson(jObj, BookLocation.ADDRESS_POSTAL_CODE_KEY, postalCode);
            found = true;
        }
        if (!TextUtils.isEmpty(city)) {
            JsonUtils.setSringInJson(jObj, BookLocation.ADDRESS_CITY_KEY, city);
            found = true;
        }
        if (!TextUtils.isEmpty(country)) {
            JsonUtils.setSringInJson(jObj, BookLocation.ADDRESS_COUNTRY_KEY, country);
            found = true;
        }

    }
    mHandler.getLooper().quit();
    if (found) {
        return jObj;
    } else return null;

person Poutrathor    schedule 23.09.2013    source источник
comment
Ваша ссылка должна вести сюда: code.google.com/p/android. /issues/detail?id=38009 Судя по моему прочтению проблемы, нет, перезагрузка не решает проблему навсегда.   -  person Mike P.    schedule 07.10.2013


Ответы (1)


ссылка от @mike гласит: резервная реализация с использованием обработчика GeoCoder и класса асинхронной задачи должна быть синхронизирована - например, если ни одна служба не может получить адрес из URL. К сожалению, это единственное решение, которое мы можем предоставить @Poutrathor.

См. здесь Служба недоступна — Geocoder Android

Также мы не можем заставить пользователя перезагрузиться, но, по крайней мере, сообщаем об этом решению.

person MOSO    schedule 08.10.2013
comment
Привет ! ваша ссылка не работает, закройте ее следующим образом: [Сервис недоступен - Геокодер Android] (ссылка) - person Poutrathor; 08.10.2013