fede1608 fede1608 - 3 months ago 34
Android Question

Android Geocoder not working in Nexus 6P with Android Nougat 7.0

I can't get the reverse geocoding feature to work in Android 7.0. It was working fine in Marshmallow, and it's working correctly on another phone with kitkat.

The error is a timeout in the request:

java.io.IOException: Timed out waiting for response from server
at android.location.Geocoder.getFromLocation(Geocoder.java:136)


The Geocoder isPresent method does return true.

Answer

I solved this by making a request to the maps api

And handled the json response like this:

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;
}