我想从纬度和经度在安卓得到以下值

街道地址 城市/州 邮政编码 完整的地址

如何做到这一点?


当前回答

1 -在onCreate方法中为LocationManager和LocationListener创建变量。

2 -检查是否有权限,因此执行位置更新并从locationManager获取lastKnownLocation,否则您将请求权限

3 -在主类中创建onRequestPermissionResult并检查是否有权限,然后执行位置更新

4 -创建分离的方法,其中包括Geocoder变量,并创建一个列表,从您的位置放置坐标, 所以为了安全起见,你检查列表是否存在,如果我们想在该列表中的每个信息是存在的,那么你使用(get通道==>街道地址),(getLocality ==>城市/州),(getPostalCode ==> Zip), (getAdminArea ==>完整地址)

5 -最后,在检查权限后调用该方法(lastKnownLocation参数==>,当应用程序运行时显示地址)和onLocationChanged with(位置参数==>,当位置改变时显示地址)

代码部分:

LocationManager locationManager;

LocationListener locationListener;

@SuppressLint("MissingPermission")
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    locationManager  = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {

            updateLocation(location);

        }
        @Override public void onStatusChanged(String provider, int status, Bundle extras) {

        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
    };

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

        Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        updateLocation(lastKnownLocation);

    }else {

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        }
    }
}


public void updateLocation ( Location location){


    Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
    try {
        List<Address> listAddresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);

        String address = "Could not find location :(";

        if (listAddresses != null && listAddresses.size() > 0) {

            if (listAddresses.get(0).getThoroughfare() != null) {

                address = listAddresses.get(0).getThoroughfare() + " ";
            }

            if (listAddresses.get(0).getLocality() != null) {

                address += listAddresses.get(0).getLocality() + " ";
            }

            if (listAddresses.get(0).getPostalCode() != null) {

                address += listAddresses.get(0).getPostalCode() + " ";
            }

            if (listAddresses.get(0).getAdminArea() != null) {

                address += listAddresses.get(0).getAdminArea();
            }
        }

        Log.i("Address",address);

    } catch (Exception e) {

        e.printStackTrace();

    }
}
}

其他回答

您需要传递纬度和经度值。

Geocoder geocoder;
        List<Address> addresses;
        geocoder = new Geocoder(getContext(), Locale.getDefault());

        try {
            addresses = geocoder. getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
            String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL

            System.out.println(address+"-------------");
        } catch (IOException e) {
            e.printStackTrace();
        }

您正在寻找“地理编码”一词。

你需要做的是:

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);

要做更多,你应该在这里阅读Geocoder。

Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());

addresses = geocoder.getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5

String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL

要了解更多可用细节,请查看Android-Location-Address

城市和国家不总是在地址1号线和2号线…

例子在这里

So,

Geocoder geocoder = new Geocoder(context, Locale.getDefault());

List<Address> addresses  = geocoder.getFromLocation(latitude,longitude, 1);
String address = addresses.get(0).getAddressLine(0);
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String zip = addresses.get(0).getPostalCode();
String country = addresses.get(0).getCountryName();

使用Geocoder类从纬度和经度中获得完整地址非常容易。下面是代码示例。希望这能有所帮助!

 if (l != null) {
        val lat = l.latitude
        val lon = l.longitude

        val geocoder = Geocoder(this, Locale.getDefault())
        val addresses: List<Address>

        addresses = geocoder.getFromLocation(lat, lon, 1) 

        val address = addresses[0].getAddressLine(0)
        val address2 = addresses[0].getAddressLine(1)
        val city = addresses[0].locality
        val state = addresses[0].adminArea
        val country = addresses[0].countryName
        val postalCode = addresses[0].postalCode
        val knownName = addresses[0].featureName

        val message =
                "Emergency situation. Call for help. My location is: " + address + "." + "http://maps.google.com/maps?saddr=" + lat + "," + lon

    }

您可以只使用地址值,因为它提供了所有完整的地址。如果需要单独的组件,也可以使用其他组件。