Android Geocoder не работает в Nexus 6P с Android Nougat 7.0
Я не могу заставить работать функцию обратного геокодирования в Android 7.0. Он отлично работал в "Зефире", и он корректно работает на другом телефоне с kitkat.
Ошибка - тайм-аут в запросе:
java.io.IOException: Timed out waiting for response from server
at android.location.Geocoder.getFromLocation(Geocoder.java:136)
Метод Geocoder isPresent возвращает true.
1 ответ
Решение
Я решил это, сделав запрос к API карты
И обработал ответ JSON следующим образом:
public void onResponse(JSONObject response) {
JsonArray results;
try {
results = ((JsonArray)new JsonParser().parse(response.get("results").toString()));
} catch (JSONException e) {
e.printStackTrace();
return;
}
String country = "";
String stateProvince = "";
String locality = "";
String hood = "";
if (results.size() > 0) {
JsonArray address = results.get(0).getAsJsonObject().get("address_components").getAsJsonArray();
for (JsonElement component : address) {
JsonObject data = component.getAsJsonObject();
for (JsonElement type : data.get("types").getAsJsonArray()) {
if (type.getAsString().equals("country")) {
country = data.get("short_name").getAsString();
} else if (type.getAsString().equals("administrative_area_level_1")) {
stateProvince = data.get("short_name").getAsString();
} else if (type.getAsString().equals("locality")) {
locality = data.get("long_name").getAsString();
} else if (type.getAsString().equals("sublocality")) {
hood = data.get("long_name").getAsString();
}
}
}
}
final String address = getFormattedAddress(country, stateProvince, locality, hood);
}
public String getFormattedAddress(String country, String state, String locality, String hood) {
String address = "";
if(hood.isEmpty()){
if(locality.isEmpty()){
if(!state.isEmpty()){
address += state;
}
}else{
address += locality;
if(!state.isEmpty()){
address += ", " + state;
}
}
}else{
address = hood;
if(locality.isEmpty()){
if(!state.isEmpty()){
address += ", " + state;
}
}else{
address += ", " + locality;
}
}
if(!country.isEmpty()){
if(!address.isEmpty()){
address += ", " + country;
}else{
address += country;
}
}
return address;
}