简体   繁体   中英

Can't Get address using Longitude & Latitude Android

I am trying to get address from longitude and latitude but unable to get the address. I am getting Longi. and lati. value but when I pass it to the function of getAddress it stop working Kindly help me if you guys can. Here is my Code

MainActivity.java File

package com.example.mygps;

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

import android.app.Activity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

    Button btnGet;
    GPS_Class gps;
    TextView adr,cty,ctry;

    double longi, lati;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnGet = (Button)findViewById(R.id.btnGo);
        adr = (TextView)findViewById(R.id.adr);
        cty = (TextView)findViewById(R.id.cty);
        ctry = (TextView)findViewById(R.id.ctry);

        btnGet.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                gps = new GPS_Class(MainActivity.this);
                if(gps.canGetLocation())
                {

                    longi = gps.getLongitude();
                    lati = gps.getLatitude();
                    Toast.makeText(MainActivity.this, "Longitude is:"+longi+"Latidute is:"+lati, Toast.LENGTH_LONG).show();
                    getAddress(longi, lati);
                }
                else
                {
                    gps.showSettingsAlert();

                }
            }
        });

    }

    public void getAddress(double longitude, double latitude)
    {
        double long1,lati1;
        long1 = longitude;
        lati1 = latitude;
        if(lati>0 && long1>0)
        {
        Geocoder geocode = new Geocoder(this, Locale.getDefault());
        List<Address> addresses;

        try {
            addresses = geocode.getFromLocation(latitude,longitude, 1);

            String Addres_ = addresses.get(0).getAddressLine(0);
            String Country = addresses.get(0).getCountryName();
            String City = addresses.get(0).getLocality();

            adr.setText(Addres_);
            cty.setText(City);
            ctry.setText(Country);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        }//if closing. . . 
        else
        {
            Toast.makeText(this, "No Vlaue", Toast.LENGTH_LONG).show();
        }


    }
}

My GPS_Class.java File Code

package com.example.mygps;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;

public class GPS_Class extends Service implements LocationListener{



    //To Get Context of the class...
    Context context;

    //Declaring Variable to use. . .
    double lattitude;
    double longitude;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;

    boolean isGPSEnabled = false;
    boolean isNetWorkEnabled = false;
    boolean canGetLocation = false;

    //Declaring objects of different classes...
    Location location;
    LocationManager locationmanager;

    public GPS_Class(Context context) {
        this.context = context;
        GetLocation();
    }

    //Self Coded Function to perform all location works . . .
    private Location GetLocation()
    {
        locationmanager = (LocationManager)context.getSystemService(LOCATION_SERVICE);  

        isGPSEnabled = locationmanager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        isNetWorkEnabled = locationmanager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if(isNetWorkEnabled)
        {
            canGetLocation = true;
            locationmanager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES,this);

            if(locationmanager !=null)
            {
                location = locationmanager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if(location !=null)
                {
                    lattitude = location.getLatitude();
                    longitude = location.getLongitude();
                }
            }
        }

        if(isGPSEnabled)
        {
            canGetLocation = true;
            if(location == null)
            {
            locationmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES,this);
            if(locationmanager != null)
            {
                location = locationmanager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                if(location!=null)
                {
                    lattitude = location.getLatitude();
                    longitude = location.getLongitude();
                }
            }
        }
        }

        return location;
    }

     public void showSettingsAlert(){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);

            // Setting Dialog Title
            alertDialog.setTitle("GPS is settings");

            // Setting Dialog Message
            alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

            // On pressing Settings button
            alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    context.startActivity(intent);
                }
            });

            // on pressing cancel button
            alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                }
            });

            // Showing Alert Message
            alertDialog.show();
        }


     public double getLatitude(){
            if(location != null){
                lattitude = location.getLatitude();
            }

            // return latitude
            return lattitude;
        }

    public double getLongitude()
    {
        if(location !=null)
        {
        longitude =location.getLongitude();
        }
        return longitude;
    }

    public boolean canGetLocation() {
        return this.canGetLocation;
    }
    @Override
    public void onLocationChanged(Location arg0) {
        // TODO Auto-generated method stub

    }

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

    }

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

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }


}

Got Solution The Above mention posted code is fine It can get the current location. If you will try to run it on emulator it will show you error because "Geocoder" class is not compatible with Emulator. Run it on Device it is Working fine.

Try with changing this with MainActivity.this in getAddress method:

Geocoder geocode = new Geocoder(MainActivity.this, Locale.getDefault());

getFromLocation method Throws. So check your latitude value. It is not in correct range:

IllegalArgumentException    if latitude is less than -90 or greater than 90

IllegalArgumentException    if longitude is less than -180 or greater than 180

IOException if the network is unavailable or any other I/O problem occurs

The actual function is getFromLocation(double latitude, double longitude, int maxResults) . You are passing longitude in place of latitude and latitude in place of longitude . Try changing this line:

addresses = geocode.getFromLocation(longitude, latitude, 1);

to this:

addresses = geocode.getFromLocation(latitude, longitude, 1);

And also add null and size check to array before accessing it to avoid NullPointerException and IndexOutOfBoundException as the documentation says it can return null array

if (addresses != null && addresses.size() > 0) {
    String Addres_ = addresses.get(0).getAddressLine(0);
    String Country = addresses.get(0).getCountryName();
    String City = addresses.get(0).getLocality();

    adr.setText(Addres_);
    cty.setText(City);
    ctry.setText(Country);
} else {
    // Reset fields here
}

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