Search code examples
androidgoogle-geocoderreverse-geocodingandroid-7.0-nougatnexus-6p

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.


Solution

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