首页 文章

如何从纬度和经度获得完整的地址?

提问于
浏览
158

我想从android中获取Latitude和Longitude的以下值

  • 街道地址

  • 城市/州

  • 邮编

  • 完整地址

怎么做到这一点?

18 回答

  • 0

    There is a last trick to get Address from Lat-Long (地理坐标) . 您只需点击经过纬度和经度的google-maps网络服务即可 . 它只是一个GET-Method网络服务 .

    它将返回可以轻松解析的JSON响应以获取地址 . 这个URL是:

    http://maps.googleapis.com/maps/api/geocode/json?latlng=32,75&sensor=true
    

    你可以 replace 32,75 with lat,long .

  • 0

    您可以轻松使用以下代码获取地址 .

    import java.io.IOException;
    import java.util.List;
    import java.util.Locale;
    
    import android.app.AlertDialog;
    import android.app.Service;
    import android.content.Context;
    import android.content.DialogInterface;
    import java.io.IOException;
    import java.util.List;
    import java.util.Locale;
    
    import android.app.AlertDialog;
    import android.app.Service;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    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.os.IBinder;
    import android.provider.Settings;
    
    public class GPSService extends Service implements LocationListener {
    
    // saving the context for later use
    private final Context mContext;
    
    // if GPS is enabled
    boolean isGPSEnabled = false;
    // if Network is enabled
    boolean isNetworkEnabled = false;
    // if Location co-ordinates are available using GPS or Network
    public boolean isLocationAvailable = false;
    
    // Location and co-ordinates coordinates
    Location mLocation;
    double mLatitude;
    double mLongitude;
    
    // Minimum time fluctuation for next update (in milliseconds)
    private static final long TIME = 30000;
    // Minimum distance fluctuation for next update (in meters)
    private static final long DISTANCE = 20;
    
    // Declaring a Location Manager
    protected LocationManager mLocationManager;
    
    public GPSService(Context context) {
        this.mContext = context;
        mLocationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);
    
    }
    
    /**
     * Returs the Location
     * 
     * @return Location or null if no location is found
     */
    public Location getLocation() {
        try {
    
            // Getting GPS status
            isGPSEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
    
            // If GPS enabled, get latitude/longitude using GPS Services
            if (isGPSEnabled) {
                mLocationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER, TIME, DISTANCE, this);
                if (mLocationManager != null) {
                    mLocation = mLocationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    if (mLocation != null) {
                        mLatitude = mLocation.getLatitude();
                        mLongitude = mLocation.getLongitude();
                        isLocationAvailable = true; // setting a flag that
                                                    // location is available
                        return mLocation;
                    }
                }
            }
    
            // If we are reaching this part, it means GPS was not able to fetch
            // any location
            // Getting network status
            isNetworkEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
            if (isNetworkEnabled) {
                mLocationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, TIME, DISTANCE, this);
                if (mLocationManager != null) {
                    mLocation = mLocationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (mLocation != null) {
                        mLatitude = mLocation.getLatitude();
                        mLongitude = mLocation.getLongitude();
                        isLocationAvailable = true; // setting a flag that
                                                    // location is available
                        return mLocation;
                    }
                }
            }
            // If reaching here means, we were not able to get location neither
            // from GPS not Network,
            if (!isGPSEnabled) {
                // so asking user to open GPS
                askUserToOpenGPS();
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
        // if reaching here means, location was not available, so setting the
        // flag as false
        isLocationAvailable = false;
        return null;
    }
    
    /**
     * Gives you complete address of the location
     * 
     * @return complete address in String
     */
    public String getLocationAddress() {
    
        if (isLocationAvailable) {
    
            Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
            // Get the current location from the input parameter list
            // Create a list to contain the result address
            List<Address> addresses = null;
            try {
                /*
                 * Return 1 address.
                 */
                addresses = geocoder.getFromLocation(mLatitude, mLongitude, 1);
            } catch (IOException e1) {
                e1.printStackTrace();
                return ("IO Exception trying to get address:" + e1);
            } catch (IllegalArgumentException e2) {
                // Error message to post in the log
                String errorString = "Illegal arguments "
                        + Double.toString(mLatitude) + " , "
                        + Double.toString(mLongitude)
                        + " passed to address service";
                e2.printStackTrace();
                return errorString;
            }
            // If the reverse geocode returned an address
            if (addresses != null && addresses.size() > 0) {
                // Get the first address
                Address address = addresses.get(0);
                /*
                 * Format the first line of address (if available), city, and
                 * country name.
                 */
                String addressText = String.format(
                        "%s, %s, %s",
                        // If there's a street address, add it
                        address.getMaxAddressLineIndex() > 0 ? address
                                .getAddressLine(0) : "",
                        // Locality is usually a city
                        address.getLocality(),
                        // The country of the address
                        address.getCountryName());
                // Return the text
                return addressText;
            } else {
                return "No address found by the service: Note to the developers, If no address is found by google itself, there is nothing you can do about it.";
            }
        } else {
            return "Location Not available";
        }
    
    }
    
    
    
    /**
     * get latitude
     * 
     * @return latitude in double
     */
    public double getLatitude() {
        if (mLocation != null) {
            mLatitude = mLocation.getLatitude();
        }
        return mLatitude;
    }
    
    /**
     * get longitude
     * 
     * @return longitude in double
     */
    public double getLongitude() {
        if (mLocation != null) {
            mLongitude = mLocation.getLongitude();
        }
        return mLongitude;
    }
    
    /**
     * close GPS to save battery
     */
    public void closeGPS() {
        if (mLocationManager != null) {
            mLocationManager.removeUpdates(GPSService.this);
        }
    }
    
    /**
     * show settings to open GPS
     */
    public void askUserToOpenGPS() {
        AlertDialog.Builder mAlertDialog = new AlertDialog.Builder(mContext);
    
        // Setting Dialog Title
        mAlertDialog.setTitle("Location not available, Open GPS?")
        .setMessage("Activate GPS to use use location services?")
        .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
                }
            })
            .setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                    }
                }).show();
    }
    
    /** 
     * Updating the location when location changes
     */
    @Override
    public void onLocationChanged(Location location) {
        mLatitude = location.getLatitude();
        mLongitude = location.getLongitude();
    }
    
    @Override
    public void onProviderDisabled(String provider) {
    }
    
    @Override
    public void onProviderEnabled(String provider) {
    }
    
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
    
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    
    }
    
  • 0

    您正在寻找术语地理编码 .

    短篇小说是你需要做的:

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

    要做更多,你应该阅读Geocoder here .

  • 20

    In onCreate()..

    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, this);
    
    
    
    
        Criteria criteria = new Criteria();
        String bestProvider = locationManager.getBestProvider(criteria, true);
        Location location = locationManager.getLastKnownLocation(bestProvider);
    
        if (location == null) {
            Toast.makeText(getApplicationContext(), "GPS signal not found",
                    3000).show();
        }
        if (location != null) {
            Log.e("locatin", "location--" + location);
    
            Log.e("latitude at beginning",
                    "@@@@@@@@@@@@@@@" + location.getLatitude());
            onLocationChanged(location);
        }
    

    Write the code in onLocationChanged()

    @Override
    public void onLocationChanged(Location location) {
    
        Geocoder geocoder;
        List<Address> addresses;
        geocoder = new Geocoder(this, Locale.getDefault());
    
        latitude = location.getLatitude();
        longitude = location.getLongitude();
    
        Log.e("latitude", "latitude--" + latitude);
    
        try {
            Log.e("latitude", "inside latitude--" + latitude);
            addresses = geocoder.getFromLocation(latitude, longitude, 1);
    
    
    
    
    
            if (addresses != null && addresses.size() > 0) {
                String address = addresses.get(0).getAddressLine(0); 
                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(); 
    
                locationTxt.setText(address + " " + city + " " + country);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
  • 409
    public static String getAddressFromLatLng(Context context, LatLng latLng) {
        Geocoder geocoder;
        List<Address> addresses;
        geocoder = new Geocoder(context, Locale.getDefault());
        try {
            addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
            return addresses.get(0).getAddressLine(0);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
    
  • 0

    CityCountry 并非始终进入地址第1行和第2行......

    示例是here

    所以,

    Geocoder geocoder = new Geocoder(context, Locale.getDefault());
    
    List<Address> addresses  = geocoder.getFromLocation(latitude,longitude, 1);
    
    String city = addresses.get(0).getLocality();
    String state = addresses.get(0).getAdminArea();
    String zip = addresses.get(0).getPostalCode();
    String country = addresses.get(0).getCountryName();
    
  • 54
    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

    只需使用此方法并传递lat,long .

    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;
    }
    
  • 23

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

    2 - 检查是否有权限,因此执行位置更新并从locationManager获取lastKnownLocation,否则您需要获得许可

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

    4 - 创建包含Geocoder变量的分离方法并创建一个列表以放置您所在位置的坐标,因此为了安全起见,检查List是否存在以及我们在该列表中想要的每个信息是否存在,那么您使用(getThoroughfare = => for Street Address),(getLocality ==> for City / State),(getPostalCode ==> for Zip),(getAdminArea ==> for Complete Address)

    5 - 最后在检查权限后调用该方法(lastKnownLocation参数==>以显示App运行时的地址)和onLocationChanged(位置参数==>显示位置更改时的地址)

    代码部分:

    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);
        }
    }
    

    @覆盖

    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();
    
        }
    }
    

    }

  • 6

    你可以创建课程

    public class GeoLocation {
    
    private Context mContext;
    
    private String mLatitude;
    private String mLongtitude;
    private String mStreet;
    private String mHouseNumber;
    private String mPostalCode;
    private String mCity;
    
    private Location mMarkerLocation;
    
    public GeoLocation (Context context) {
        mContext = context;
    }
    
    public String getStreet () {
        return mStreet;
    }
    
    public String getHouseNumber () {
        return mHouseNumber;
    }
    
    public String getPostalCode () {
        return mPostalCode;
    }
    
    public String getCity () {
        return mCity;
    }
    
    public String getLatitude () {
        return mLatitude;
    }
    
    public String getLongtitude () {
        return mLongtitude;
    }
    
    // Lookup address via reverse geolocation
    // Call this one
    public void lookUpAddress (Location markerLocation) {
        mMarkerLocation = markerLocation;
        if (Geocoder.isPresent()) {
            (new GetAddressTask(mContext)).execute();
        }
    }
    
    public class GetAddressTask extends AsyncTask<android.location.Location, Void, String> {
    
        public GetAddressTask (Context context) {
            super();
            mContext = context;
        }
    
        @Override
        protected String doInBackground (android.location.Location... params) {
            Geocoder geocoder =
                    new Geocoder(mContext, Locale.getDefault());
            android.location.Location location = params[0];
    
            List<Address> addresses = null;
            try {
                if (mMarkerLocation != null) {
                    addresses = geocoder.getFromLocation(mMarkerLocation.getLatitude(),
                            mMarkerLocation.getLongitude(), 1);
                }
            } catch (IOException exception) {
                Log.e("ComplaintLocation",
                        "IO Exception in getFromLocation()", exception);
    
                return ("IO Exception trying to get address");
            } catch (IllegalArgumentException exception) {
                String errorString = "Illegal arguments " +
                        Double.toString(location.getLatitude()) + " , " +
                        Double.toString(location.getLongitude()) + " passed to address service";
                Log.e("LocationSampleActivity", errorString, exception);
    
                return errorString;
            }
    
            if (addresses != null && addresses.size() > 0) {
                Address address = addresses.get(0);
    
                if (address.getMaxAddressLineIndex() > 0) {
                    return String.format(
                            "%s/%s/%s/%s/%s/%s",
                            address.getLatitude(), // 0
                            address.getLongitude(), // 1
                            address.getThoroughfare(), // 2
                            address.getSubThoroughfare(), //3
                            address.getPostalCode(), // 4
                            address.getLocality()); // 5
                } else {
                    return String.format(
                            "%s/%s/%s/%s",
                            address.getLatitude(), // 0
                            address.getLongitude(), // 1
                            address.getPostalCode(), // 2
                            address.getLocality()); // 3
                }
            } else return "No address found";
        }
    
        // Format address string after lookup
        @Override
        protected void onPostExecute (String address) {
    
            String[] addressFields = TextUtils.split(address, "/");
            Log.d("ADDRESS ARRAY", Arrays.toString(addressFields));
    
            // Workaround: doInBackground can only return Strings instead of, for example, an
            // Address instance or a String[] directly. To be able to use TextUtils.isEmpty()
            // on fields returned by this method, set each String that currently reads "null" to
            // a null reference
            for (int fieldcnt = 0; fieldcnt < addressFields.length; ++fieldcnt) {
                if (addressFields[fieldcnt].equals("null"))
                    addressFields[fieldcnt] = null;
            }
    
            switch (addressFields.length) {
                case 4:
                    mStreet = null;
                    mHouseNumber = null;
                    mLatitude = addressFields[0];
                    mLongtitude = addressFields[1];
                    mPostalCode = addressFields[2];
                    mCity = addressFields[3];
                    break;
                case 6:
                    mLatitude = addressFields[0];
                    mLongtitude = addressFields[1];
                    mStreet = addressFields[2];
                    mHouseNumber = addressFields[3];
                    mPostalCode = addressFields[4];
                    mCity = addressFields[5];
                    break;
                default:
                    mLatitude = null;
                    mLongtitude = null;
                    mStreet = null;
                    mHouseNumber = null;
                    mPostalCode = null;
                    mCity = null;
                    break;
            }
    
            Log.d("GeoLocation Street", mStreet);
            Log.d("GeoLocation No.", mHouseNumber);
            Log.d("GeoLocation Postalcode", mPostalCode);
            Log.d("GeoLocation Locality", mCity);
            Log.d("GeoLocation Lat/Lng", "[" + mLatitude + ", " + mLongtitude + 
        "]");
        }
     }
       }
    

    然后使用实例化它

    GeoLocation geoLocation = new GeoLocation(getActivity()); // or (this) if 
    called from an activity and not from a fragment
    mGeoLocation.lookUpAddress(LOCATION_FROM_MAP);
    
  • 0
    Geocoder geocoder =new Geocoder(mContext, Locale.getDefault());
     // Get the current location from the input parameter list
      Location loc = params[0];
     // Create a list to contain the result address
      List<Address> addresses = null;
      try {
         addresses = geocoder.getFromLocation(loc.getLatitude(),
                 loc.getLongitude(), 10);
     } catch (IOException e1) {
               Log.e("LocationSampleActivity","IO Exception in getFromLocation()");
          e1.printStackTrace();
    
     } catch (IllegalArgumentException e2) {
     // Error message to post in the log
     String errorString = "Illegal arguments " +
             Double.toString(loc.getLatitude()) +
             " , " +
             Double.toString(loc.getLongitude()) +
             " passed to address service";
     Log.e("LocationSampleActivity", errorString);
     e2.printStackTrace();
    
     }
     Address address=null;
     String zip=null;
     String city=null;
     String state=null;
     StringBuffer st=new StringBuffer();
     // If the reverse geocode returned an address
     if (addresses != null && addresses.size() > 0) {
     String       add=addresses.get(0).getAddressLine(0)+","
      +addresses.get(0).getSubAdminArea()+","
      +addresses.get(0).getSubLocality();
      city=addresses.get(0).getLocality();
      state=addresses.get(0).getAdminArea();
         // Get the first address
      for(int i=0 ;i<addresses.size();i++){
      address = addresses.get(i);
       if(address.getPostalCode()!=null){
    zip=address.getPostalCode();
    break;
         }
    
          }
    
  • 1

    使用它对我有用:D

    检索纬度和经度的json数据 .

    https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyAr29XeWWAeWZcrOgjjfs3iSnqkWtAz4No&latlng=2.1812,102.4266&sensor=true

    用你自己的地方改变纬度,经度 .

    https://maps.googleapis.com/maps/api/geocode/json?key= <\ API_KEY_HERE>&latlng = "latitude","longitude"&sensor = true

    您可以使用自己的密钥更改<\ API_KEY_HERE> .

    需要在谷歌控制台中为新的api密钥启用api服务 .

    希望它有所帮助:D

  • 0
    public String getAddress(LatLng latLng) {
        String cAddress = "";
        if (latLng == null) {
            errorMessage = "no_location_data_provided";
            Log.wtf(TAG, errorMessage);
            return "";
        }
        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
    
        // Address found using the Geocoder.
        List<Address> addresses = null;
    
        try {
            // Using getFromLocation() returns an array of Addresses for the area immediately
            // surrounding the given latitude and longitude. The results are a best guess and are
            // not guaranteed to be accurate.
            addresses = geocoder.getFromLocation(
                    latLng.latitude,
                    latLng.longitude,
                    // In this sample, we get just a single address.
                    1);
        } catch (IOException ioException) {
            // Catch network or other I/O problems.
            errorMessage = "service_not_available";
            Log.e(TAG, errorMessage, ioException);
        } catch (IllegalArgumentException illegalArgumentException) {
            // Catch invalid latitude or longitude values.
            errorMessage = "invalid_lat_long_used";
            Log.e(TAG, errorMessage + ". " +
                    "Latitude = " + latLng.latitude +
                    ", Longitude = " + latLng.longitude, illegalArgumentException);
        }
    
        // Handle case where no address was found.
        if (addresses == null || addresses.size() == 0) {
            if (errorMessage.isEmpty()) {
                errorMessage = "no_address_found";
                Log.e(TAG, errorMessage);
            }
        } else {
            Address address = addresses.get(0);
            ArrayList<String> addressFragments = new ArrayList<String>();
            // Fetch the address lines using {@code getAddressLine},
            // join them, and send them to the thread. The {@link android.location.address}
            // class provides other options for fetching address details that you may prefer
            // to use. Here are some examples:
            // getLocality() ("Mountain View", for example)
            // getAdminArea() ("CA", for example)
            // getPostalCode() ("94043", for example)
            // getCountryCode() ("US", for example)
            // getCountryName() ("United States", for example)
            String allAddress = "";
            for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
                addressFragments.add(address.getAddressLine(i));
                allAddress += address.getAddressLine(i) + " ";
            }
            if (address.getAdminArea() != null) {
                state = address.getAdminArea();
            } else {
                state = "";
            }
            if (address.getLocality() != null) {
                city = address.getLocality();
            } else {
                city = "";
            }
            if (address.getPostalCode() != null) {
                postalCode = address.getPostalCode();
            } else {
                postalCode = "";
            }
    
            Log.i(TAG, "address_found");
            //driverAddress = TextUtils.join(System.getProperty("line.separator"), addressFragments);
            cAddress = allAddress;
            Log.e("result", cAddress.toString());
        }
        return cAddress;
    }
    

    您可以使用此方法对正确的完整地址进行地理编码

  • 0

    使用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
    
        }
    

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

  • 4

    似乎没有人提供Google Docs(https://developer.android.com/training/location/display-address#java)建议的解决方案 . 正确的解决方案应该使用IntentService来进行反向地理编码的网络调用 .

    使用意图服务而不是AsyncTask,因为它不依赖于任何特定活动 . 即 . 它有自己的生命周期 . 完成地理编码后,IntentService将自行停止 .

    public class GeocodingService extends IntentService {
    
        public GeocodingService() {
            super("GeocodingService");
        }
    
    
        @Override
        protected void onHandleIntent(@Nullable Intent intent) {
            if (intent == null) {
                return;
            }
    
            Geocoder geocoder = new Geocoder(this, Locale.getDefault());
            String errorMessage = "";
            BCCDatabase BCCDatabase = skicompanion.skicompanion.storage.BCCDatabase.getInstance(getApplicationContext());
    
            // Get the location passed to this service through an extra.
            Location location = intent.getParcelableExtra(
                    "location");
            long trackID = intent.getLongExtra("trackID", -1);
    
            List<Address> addresses = null;
            String addressString = "";
    
            try {
                addresses = geocoder.getFromLocation(
                        location.getLatitude(),
                        location.getLongitude(),
                        1);
            } catch (IOException ioException) {
                // Catch network or other I/O problems.
                errorMessage = "service not available";
                Log.d(Constants.SkiCompanionDebug, errorMessage, ioException);
            } catch (IllegalArgumentException illegalArgumentException) {
                // Catch invalid latitude or longitude values.
                errorMessage = "invalid lat long used";
                Log.d(Constants.SkiCompanionDebug, errorMessage + ". " +
                        "Latitude = " + location.getLatitude() +
                        ", Longitude = " +
                        location.getLongitude(), illegalArgumentException);
            }
    
            // Handle case where no address was found.
            if (addresses == null || addresses.size()  == 0) {
                if (errorMessage.isEmpty()) {
                    errorMessage = "no address found";
                    Log.d(Constants.SkiCompanionDebug, errorMessage);
                }
            } else {
                if(addresses.get(0).getLocality() != null){
                    addressString += addresses.get(0).getLocality() + ", ";
                }
                if(addresses.get(0).getAdminArea() != null){
                    addressString += addresses.get(0).getAdminArea() + ", ";
                }
                if(addresses.get(0).getCountryName() != null){
                    addressString += addresses.get(0).getCountryName();
                }
                //updating DB
                BCCDatabase.setTrackLocation(trackID, addressString);
    
                Log.d(Constants.SkiCompanionDebug, "address found: "+ addressString);
            }
        }
    }
    
  • 3

    试试这个我的朋友

    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;
            }
    
  • 0
    double latitude = networkLocation.getLatitude();
               double longitude = networkLocation.getLongitude();
               LocationAddress locationAddress = new LocationAddress();
               locationAddress.getAddressFromLocation(latitude , longitude , getApplicationContext(), new GeocoderHandler());
    

    有关更多信息,请单击here

  • 0

    尝试使用地理编码器使用下面的代码:

    Geocoder gcd = new Geocoder(MainActivity.this, Locale.getDefault());
      List<Address> geoAddresses = geoAddresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
      if (geoAddresses.size() > 0) {
          String mUserLocation = "";
          for (int i = 0; i < 4; i++) { //Since it return only four value we declare this as static.
               mUserLocation = mUserLocation + geoAddresses.get(0).getAddressLine(i).replace(",", "") + ", ";
            } 
        }
    

相关问题