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

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

如何做到这一点?


当前回答

试试这个,我的朋友

 private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {
            String strAdd = "";
            Geocoder geocoder = new Geocoder(this, Locale.getDefault());
            try {
                List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);
                if (addresses != null) {
                    Address returnedAddress = addresses.get(0);
                    StringBuilder strReturnedAddress = new StringBuilder("");

                    for (int i = 0; i <= returnedAddress.getMaxAddressLineIndex(); i++) {
                        strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
                    }
                    strAdd = strReturnedAddress.toString();
                    Log.w("My Current loction address", strReturnedAddress.toString());
                } else {
                    Log.w("My Current loction address", "No Address returned!");
                }
            } catch (Exception e) {
                e.printStackTrace();
                Log.w("My Current loction address", "Canont get Address!");
            }
            return strAdd;
        }

其他回答

你可以这样做,以获得完整的经纬度地址:

  public class MainActivity extends AppCompatActivity {

         ...

  private Geocoder geocoder;
  private TextView mAddressTxtVu;

         ...


  // I assume that you got latitude and longitude correctly 

  mLatitude  =  20.23232
  mLongitude =  32.999

  String errorMessage = "";

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

  List<Address> addresses = null;

  try {
              addresses = geocoder.getFromLocation(
                       mlattitude,
                       mlongitude,
                       1);
      } catch (IOException e) {
              errorMessage = getString(R.string.service_not_available);
              Log.e(TAG, errorMessage, e);
      } catch (IllegalArgumentException illegalArgumentException) {
                        // Catch invalid latitude or longitude values.
              errorMessage = getString(R.string.invalid_lat_long_used);
              Log.e(TAG, errorMessage + ". " + "Latitude = " + mlattitude +", Longitude = " + mlongitude, illegalArgumentException);
      }

      // Handle case where no address was found.
      if (addresses == null || addresses.size() == 0) {
             if (errorMessage.isEmpty()) {
                      errorMessage = getString(R.string.no_address_found);
                      Log.e(TAG, errorMessage);
             }

      } else {
             Address address = addresses.get(0);
             ArrayList<String> addressFragments = new ArrayList<String>();

             // Fetch the address lines using getAddressLine,
             // join them, and send them to the thread.
             for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
                      addressFragments.add(address.getAddressLine(i));
             }
             // Log.i(TAG, getString(R.string.address_found));


    mAddressTxtVu.setText(TextUtils.join(System.getProperty("line.separator"),
                                addressFragments));
                    }

只要用这个方法,把你的背,长。

public static void getAddress(Context context, double LATITUDE, double LONGITUDE{
    //Set Address
    try {
        Geocoder geocoder = new Geocoder(context, Locale.getDefault());
        List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);

        if (addresses != null && addresses.size() > 0) {
            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
            Log.d(TAG, "getAddress:  address" + address);
            Log.d(TAG, "getAddress:  city" + city);
            Log.d(TAG, "getAddress:  state" + state);
            Log.d(TAG, "getAddress:  postalCode" + postalCode);
            Log.d(TAG, "getAddress:  knownName" + knownName);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    return;
}

城市和国家不总是在地址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();

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(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