3

I need to get the zip code from a latitude and longitude, Im able to get the address with street names but cannot get the zip code. String pCode is returning Null in the below code. Below is the code I'm using:

    import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

public class GetCurrentLocation extends Activity implements OnClickListener {

    private LocationManager locationMangaer=null;
    private LocationListener locationListener=null; 

    private Button btnGetLocation = null;
    private EditText editLocation = null;   
    private ProgressBar pb =null;

    private static final String TAG = "Debug";
    private Boolean flag = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        //if you want to lock screen for always Portrait mode  
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        pb = (ProgressBar) findViewById(R.id.progressBar1);
        pb.setVisibility(View.INVISIBLE);

        editLocation = (EditText) findViewById(R.id.editTextLocation);  

        btnGetLocation = (Button) findViewById(R.id.btnLocation);
        btnGetLocation.setOnClickListener(this);

        locationMangaer = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    }

    @Override
    public void onClick(View v) {
        flag = displayGpsStatus();
        if (flag) {

            Log.v(TAG, "onClick");      

            editLocation.setText("Please!! move your device to see the changes in coordinates."+"\nWait..");

            pb.setVisibility(View.VISIBLE);
            locationListener = new MyLocationListener();

            locationMangaer.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10,
                    locationListener);

            } else {
            alertbox("Gps Status!!", "Your GPS is: OFF");
        }

    }

    /*----------Method to Check GPS is enable or disable ------------- */
    private Boolean displayGpsStatus() {
        ContentResolver contentResolver = getBaseContext().getContentResolver();
        boolean gpsStatus = Settings.Secure.isLocationProviderEnabled(
                contentResolver, LocationManager.GPS_PROVIDER);
        if (gpsStatus) {
            return true;

        } else {
            return false;
        }
    }

    /*----------Method to create an AlertBox ------------- */
    protected void alertbox(String title, String mymessage) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Your Device's GPS is Disable")
                .setCancelable(false)
                .setTitle("** Gps Status **")
                .setPositiveButton("Gps On",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // finish the current activity
                                // AlertBoxAdvance.this.finish();
                                Intent myIntent = new Intent(
                                        Settings.ACTION_SECURITY_SETTINGS);
                                startActivity(myIntent);
                                dialog.cancel();
                            }
                        })
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // cancel the dialog box
                                dialog.cancel();
                            }
                        });
        AlertDialog alert = builder.create();
        alert.show();
    }

    /*----------Listener class to get coordinates ------------- */
    private class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location loc) {

                editLocation.setText("");
                pb.setVisibility(View.INVISIBLE);
                Toast.makeText(getBaseContext(),"Location changed : Lat: " + loc.getLatitude()
                                + " Lng: " + loc.getLongitude(),Toast.LENGTH_SHORT).show();
                String longitude = "Longitude: " +loc.getLongitude();  
                Log.v(TAG, longitude);
                String latitude = "Latitude: " +loc.getLatitude();
                Log.v(TAG, latitude);

                /*----------to get City-Name from coordinates ------------- */
                String cityName=null;
                String addrs = null;
                String pCode = null;
                Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());                  
                List<Address>  addresses;  
                try {  
                 addresses = gcd.getFromLocation(loc.getLatitude(), loc.getLongitude(), 1);  
                 if (addresses.size() > 0)  
                  System.out.println(addresses.get(0).getLocality());

                 cityName=addresses.get(0).getLocality();
                 addrs = addresses.get(0).getAddressLine(0);
                 pCode = addresses.get(0).getPostalCode();
                } catch (IOException e) {                 
                 e.printStackTrace();  
                } 

                String s = longitude+"\n"+latitude +"\n\nMy Currrent City is: "+cityName+" Address "+ addrs+
                        " Postal Code"+pCode;
                editLocation.setText(s);
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub          
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub          
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub          
        }
    }



}

2 Answers2

1

use this api it will give zipcode also. by passing lat and log. http://ws.geonames.org/findNearbyPostalCodesJSON?formatted=true&lat=23.0333&lng=72.6167

Bhavesh Jethani
  • 3,891
  • 4
  • 24
  • 42
0

the Discription of the API .getFromLocation states :

The returned values may be obtained by means of a network lookup. The results are a best guess and are not guaranteed to be meaningful or correct.

So there is a good chance that the location returned only has some info missing.

There are 2 solution's for your issue:

1) Increase the maxResults , lets say 5. And check if any of the 5 has a postal code.( query could return less than 5 so make sure to put appropriate check)

2) refer ZipCode from location , for how to query it separately if we have city name.

Community
  • 1
  • 1
Nimish Choudhary
  • 2,048
  • 18
  • 17