简体   繁体   中英

Geocoder often returns null vallues in Android

I am trying to pass geocoder values from MapFragment to LocationDetailsActivity.

I get the correct values for lat and lng, but when I try to display any of the other values, most of the times I get null values instead of the city and zip (but not always), while a lot of the times I get the correct country and state (also not always).

MapFragment Code:

// Set default latitude and longitude
double latitude = 15.4825766;
double longitude = -5.0076589;

// Get latitude and longitude of the current location and a LatLng object
if (myLocation != null) {
    latitude = myLocation.getLatitude();
    longitude = myLocation.getLongitude();
}

mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {

    @Override
    public void onMapLongClick(LatLng arg0) {

        Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault());
        try {
                List<Address> allAddresses = geocoder.getFromLocation(arg0.latitude, arg0.longitude, 1);
                if (allAddresses.size() > 0 && allAddresses != null) {
                    Address address = allAddresses.get(0);
                    Intent intent = new Intent(getActivity(), LocationDetailsActivity.class);
                    intent.putExtra("latitude", arg0.latitude);
                    intent.putExtra("longitude", arg0.longitude);
                    intent.putExtra("city", allAddresses.get(0).getLocality());
                    intent.putExtra("zip", allAddresses.get(0).getPostalCode());
                    intent.putExtra("state", allAddresses.get(0).getAdminArea());
                    intent.putExtra("country", allAddresses.get(0).getCountryName());
                    startActivity(intent);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        }
    });

LocationDetailsActivity Code:

    Bundle bundle = getIntent().getExtras();
    double lat = bundle.getDouble("latitude");
    double lng = bundle.getDouble("longitude");
    String city = intent.getStringExtra("city");
    String zip = intent.getStringExtra("zip");
    String state = intent.getStringExtra("state");
    String country = intent.getStringExtra("country");

    // I display my values here
    mFirstValueDisplay.setText(String.valueOf(city));
    mSecondValueDisplay.setText(String.valueOf(zip));

Android's geocoding api is pretty unreliable up-to my experience, I usually make a request to the Google's geocoding webservices on Url : "https://maps.googleapis.com/maps/api/geocode" (If you are familiar with retrofit)

@GET("/json")
    void reverseGeoCode(@Query("latlng") String latlng, @Query("language") String language,
                        @Query("key") String key, Callback<ReverseGeoCode> callback);

latlng The latitude and longitude you want to reverse geocode.

language language of the geocoded response

key Your Api key

Go here for more info

Geocoder often got the values right, but more often than not I got null values. Based on @insomniac's advice I modified my code:

    public void onMapLongClick(final LatLng arg0) {

            RequestQueue queue = Volley.newRequestQueue(getActivity());
            String url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + String.valueOf(arg0.latitude) + "," + String.valueOf(arg0.longitude) + "&key=myKeyCode";

            // Request a string response from the provided URL.
            StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            try {
                                JSONArray jObj = new JSONObject(response).getJSONArray("results").getJSONObject(0).getJSONArray("address_components");

                                Intent intent = new Intent(getActivity(), LocationDetailsActivity .class);

                                for (int i = 0; i < jObj.length(); i++) {
                                    String componentName = new JSONObject(jObj.getString(i)).getJSONArray("types").getString(0);
                                    if (componentName.equals("postal_code") || componentName.equals("locality")) {
                                        intent.putExtra(componentName, new JSONObject(jObj.getString(i)).getString("short_name"));
                                    }
                                }

                                intent.putExtra("latitude", arg0.latitude);
                                intent.putExtra("longitude", arg0.longitude);

                                startActivity(intent);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    int x = 1;
                }
            });
    // Add the request to the RequestQueue.
            queue.add(stringRequest);

It still displays some areas as null. But those are smaller areas. Hope someone finds it helpful.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM