简体   繁体   English

无法使用经度和纬度Android获取地址

[英]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. 值,但是当我将其传递给getAddress函数时,它将停止工作。如果可以的话,请帮我。 Here is my Code 这是我的代码

MainActivity.java File MainActivity.java文件

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 我的GPS_Class.java文件代码

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. 如果您尝试在模拟器上运行它,则会显示错误,因为“ Geocoder”类与模拟器不兼容。 Run it on Device it is Working fine. 在正常运行的设备上运行它。

Try with changing this with MainActivity.this in getAddress method: 尝试改变thisMainActivity.thisgetAddress方法:

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

getFromLocation method Throws. getFromLocation方法抛出。 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) . 实际的功能是getFromLocation(double latitude, double longitude, int maxResults) You are passing longitude in place of latitude and latitude in place of longitude . 您正在通过longitude代替latitudelatitude代替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 并且还要在访问数组之前向数组添加null和大小检查,以避免NullPointerExceptionIndexOutOfBoundException因为文档说它可以返回null数组

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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