2016-08-21 6 views
2

Я пытаюсь получить широту и долготу конкретных адресов, используя addressList = geoCoder.getFromLocationName (locationName, 1);Android Geocoder getFromLocationName не работает с действительным адресом

Для большинства адресов это работает отлично, но есть некоторые действительные адреса, такие как «Lentoasemantie 1, Vantaa», который возвращает пустой массив. Странная вещь заключается в том, что действительные адреса использовались для работы 4 дня назад, но не больше, в то время как большинство адресов продолжают работать.

Итак, это похоже на проблему с бэкэнд Google, и мне интересно, должен ли я сообщить об этом Google (где/как?) Или отказаться от использования Geocoder, потому что он по своей сути ненадежен?

ответ

1

Geocoder Android API не так эффективен, как API геокодирования Google Maps, поэтому я предлагаю вам использовать этот вместо Geocoder. Ниже приведена функция, чтобы получить местоположение от адреса по очереди Volley (для Lentoasemantie 1, Vantaa, это работает):

public void getLocationFromAddress(String address) { 
    String url = "https://maps.googleapis.com/maps/api/geocode/json?address=" 
      + Uri.encode(address) + "&sensor=true&key=API_KEY"; 
    RequestQueue queue = Volley.newRequestQueue(this); 
    JsonObjectRequest stateReq = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      JSONObject location; 
      try { 
       // Get JSON Array called "results" and then get the 0th 
       // complete object as JSON 
       location = response.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location"); 
       // Get the value of the attribute whose name is 
       // "formatted_string" 
       if (location.getDouble("lat") != 0 && location.getDouble("lng") != 0) { 
        LatLng latLng = new LatLng(location.getDouble("lat"), location.getDouble("lng")); 

        //Do what you want 
       } 
      } catch (JSONException e1) { 
       e1.printStackTrace(); 

      } 
     } 

    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d("Error.Response", error.toString()); 
     } 
    }); 
    // add it to the queue 
    queue.add(stateReq); 

}