【问题标题】:How to get complete details of current location using GPS & Location Manager如何使用 GPS 和位置管理器获取当前位置的完整详细信息
【发布时间】:2012-12-11 09:11:47
【问题描述】:

我正在使用 GPS 获取位置的经度和纬度,但现在我想获取位置的每一个细节,例如:国家、城市、州、邮政编码、街道号码等。 当前位置的最大详细信息。

代码:

  public class GPSTracker extends Service implements LocationListener {

private final Context mContext;

// flag for GPS status
boolean isGPSEnabled = false;

// flag for network status
boolean isNetworkEnabled = false;

// flag for GPS status
boolean canGetLocation = false;

Location location; // location
double latitude; // latitude
double longitude; // longitude
String country;

// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

// Declaring a Location Manager
protected LocationManager locationManager;

public GPSTracker(Context context) {
    this.mContext = context;
    getLocation();
}

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
isNetworkEnabled = locationManager
                .isProviderEnabled
       (LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
        location = locationManager
                            .getLastKnownLocation
          (LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
        longitude = location.getLongitude();

                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
            locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER,
               MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
  Log.d("GPS Enabled", "GPS Enabled");
      if (locationManager != null) {    
     location = locationManager.getLastKnownLocation
     (LocationManager.GPS_PROVIDER);
    if (location != null) {
    latitude = location.getLatitude();
                longitude = location.getLongitude();

                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
 }

【问题讨论】:

标签: android android-emulator android-location


【解决方案1】:
private void initmainIntent() {

    LocationResult locationResult = new LocationResult() {

        @Override
        public void gotLocation(Location location) {
            if (location != null) {
                Geocoder gcd = new Geocoder(getApplicationContext(),
                        Locale.getDefault());
                List<Address> addresses;
                try {
                    addresses = gcd.getFromLocation(location.getLatitude(),
                            location.getLongitude(), 1);

                    if (addresses.size() > 0) {
                        String s = "Address Line: "
                                + addresses.get(0).getAddressLine(0) + "\n"
                                + addresses.get(0).getFeatureName() + "\n"
                                + "Locality: "
                                + addresses.get(0).getLocality() + "\n"
                                + addresses.get(0).getPremises() + "\n"
                                + "Admin Area: "
                                + addresses.get(0).getAdminArea() + "\n"
                                + "Country code: "
                                + addresses.get(0).getCountryCode() + "\n"
                                + "Country name: "
                                + addresses.get(0).getCountryName() + "\n"
                                + "Phone: " + addresses.get(0).getPhone()
                                + "\n" + "Postbox: "
                                + addresses.get(0).getPostalCode() + "\n"
                                + "SubLocality: "
                                + addresses.get(0).getSubLocality() + "\n"
                                + "SubAdminArea: "
                                + addresses.get(0).getSubAdminArea() + "\n"
                                + "SubThoroughfare: "
                                + addresses.get(0).getSubThoroughfare()
                                + "\n" + "Thoroughfare: "
                                + addresses.get(0).getThoroughfare() + "\n"
                                + "URL: " + addresses.get(0).getUrl();
                        locationNotFound.setVisibility(View.GONE);
                        locationFound.setVisibility(View.VISIBLE);
                        foundLocationText.setText(s);
                    }

                } catch (IOException e) {

                    e.printStackTrace();
                }

                background(location.getLatitude(), location.getLongitude());
            }
        }
    };
    MyLocation myLocation = new MyLocation();
    myLocation.getLocation(this, locationResult);
}



public class MyLocation {
    Timer timer1;
    LocationManager lm;
    LocationResult locationResult;
    boolean gps_enabled = false;
    boolean network_enabled = false;

    public boolean getLocation(Context context, LocationResult result) {
        // I use LocationResult callback class to pass location value from
        // MyLocation to user code.
        locationResult = result;
        if (lm == null)
            lm = (LocationManager) context
                    .getSystemService(Context.LOCATION_SERVICE);

        // exceptions will be thrown if provider is not permitted.
        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        try {
            network_enabled = lm
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
        }

        // don't start listeners if no provider is enabled
        if (!gps_enabled && !network_enabled)
            return false;

        if (gps_enabled)
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                    locationListenerGps);
        if (network_enabled)
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
                    locationListenerNetwork);
        timer1 = new Timer();
        timer1.schedule(new GetLastLocation(), 20000);
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerNetwork);
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

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

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            if (location != null) {
                System.out.println(location.getLatitude());

            }
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerGps);
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

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

    class GetLastLocation extends TimerTask {
        @Override
        public void run() {
            lm.removeUpdates(locationListenerGps);
            lm.removeUpdates(locationListenerNetwork);

            Location net_loc = null, gps_loc = null;
            if (gps_enabled)
                gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (network_enabled)
                net_loc = lm
                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            // if there are both values use the latest one
            if (gps_loc != null && net_loc != null) {
                if (gps_loc.getTime() > net_loc.getTime())
                    locationResult.gotLocation(gps_loc);
                else
                    locationResult.gotLocation(net_loc);
                return;
            }

            if (gps_loc != null) {
                locationResult.gotLocation(gps_loc);
                return;
            }
            if (net_loc != null) {
                locationResult.gotLocation(net_loc);
                return;
            }
            locationResult.gotLocation(null);
        }
    }

    public static abstract class LocationResult {
        public abstract void gotLocation(Location location);
    }
}

【讨论】:

    【解决方案2】:

    这是Get Current location and City name using GPS的教程

    获得 GPS 坐标后 通过使用 Geocoder 类,您可以了解每个细节

    请参阅下面的代码片段,用于获取当前城市同样的方式,您也可以获取其他详细信息。

        private class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location loc) {
    
            editLocation.setText("");
            pb.setVisibility(View.INVISIBLE);
            Toast.makeText(
                    getBaseContext(),
                    "Location changed : Lat: " + loc.getLatitude() + " Lng: "
                            + loc.getLongitude(), Toast.LENGTH_SHORT).show();
            String longitude = "Longitude: " + loc.getLongitude();
            Log.v(TAG, longitude);
            String latitude = "Latitude: " + loc.getLatitude();
            Log.v(TAG, latitude);
    
            /*----------to get City-Name from coordinates ------------- */
            String cityName = null;
            Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
            List<Address> addresses;
            try {
                addresses = gcd.getFromLocation(loc.getLatitude(),
                        loc.getLongitude(), 1);
                if (addresses.size() > 0)
                    System.out.println(addresses.get(0).getLocality());
                cityName = addresses.get(0).getLocality();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            String s = longitude + "\n" + latitude + "\n\nMy Currrent City is: "
                    + cityName;
            editLocation.setText(s);
        }
    
        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub
        }
    } 
    

    更新(根据评论)

    如果您想通过短信将此详细信息发送给任何联系人。 我想说this 页面可以帮助你

    【讨论】:

    • 伟大的工作伙伴,如果我想将此详细信息发送到任何一个联系电话号码,我希望您也完成了该教程...您让我的一天非常棒。 ..真的很有帮助
    • 你能解释一下这个的用法吗:5000, 10 ......这是时间和距离吗?
    • 我很高兴它可以帮助你:) 是的 5000 是时间和 10 距离。请!在 android 文档中检查 requestLocationUpdates() 方法。
    • 我喜欢您的即时和宝贵的支持,您已经证明您是帮助许多新开发人员和学习者的天才开发人员之一,上帝保佑您 :) 好的最后一个问题,如果我想了解更多详细信息比如:州,街道等等,总之完整的地址a到z....我怎么能得到那个
    • @CarryHog 好的听起来不错!!我只是想更新我的代码并在设备中执行以确保其正常工作。好吧,你做到了,很高兴来到这里。
    【解决方案3】:

    使用此代码,您可以找到街道、州、国家/地区和 Pin 等地址。

    Geocoder geoCoder = new Geocoder(context, Locale.getDefault());
            List<Address> addresses = geoCoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
            String address = "";
            if (addresses != null && addresses.size() >= 0) {
                address = addresses.get(0).getAddressLine(0);
    
                if (addresses != null && addresses.size() >= 1) {
                    address += ", " + addresses.get(0).getAddressLine(1);
                }
    
                if (addresses != null && addresses.size() >= 2) {
                    address += ", " + addresses.get(0).getAddressLine(2);
                }
            }
    

    并且您需要在单独的线程或 AsyncTask 中运行此代码,因为它会在内部调用网络连接。

    【讨论】:

    • 谢谢你,工作
    【解决方案4】:

    不知何故,我花了很多时间来完成这项任务。在下面的代码中,检测到onMapReady 设备位置并在该位置显示marker。点击marker会显示位置地址。

    public class StoreFinder extends FragmentActivity implements
        OnMapReadyCallback,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {
    
        private GoogleMap mMap;
        private GoogleApiClient googleApiClient;
        private LocationRequest locationRequest;
        private Location lastLocation;
        private Marker currentUserLocationMarker;
        private static final int Request_User_Location_Code = 99;
        private double latitude;
        double longitude;
        private int ProximityRadius = 10000;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_location);
    
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            {
                checkUserLocationPermission();
            }
    
    
            // Obtain the SupportMapFragment and get notified when the map is ready to be used.
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
    
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
            {
                buildGoogleApiClient();
    
                mMap.setMyLocationEnabled(true);
            }
    
        }
    
        public boolean checkUserLocationPermission()
        {
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION))
                {
                    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, Request_User_Location_Code);
                }
                else
                {
                    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, Request_User_Location_Code);
                }
                return false;
            }
            else
            {
                return true;
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
        {
            switch (requestCode)
            {
                case Request_User_Location_Code:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                    {
                        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
                        {
                            if (googleApiClient == null)
                            {
                                buildGoogleApiClient();
                            }
                            mMap.setMyLocationEnabled(true);
                        }
                    }
                    else
                    {
                        Toast.makeText(this, "Permission Denied...", Toast.LENGTH_SHORT).show();
                    }
                    return;
            }
        }
    
        protected synchronized void buildGoogleApiClient()
        {
            googleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
    
            googleApiClient.connect();
        }
    
        @Override
        public void onLocationChanged(Location location)
        {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
    
            lastLocation = location;
    
            if (currentUserLocationMarker != null)
            {
                currentUserLocationMarker.remove();
            }
    
              /*----------to get City-Name from coordinates ------------- */
            String cityName = null;
            Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
            List<Address> addresses;
            try {
                addresses = gcd.getFromLocation(latitude, latitude, 1);
                if (addresses.size() > 0)
                    System.out.println(addresses.get(0).getLocality());
                    cityName = addresses.get(0).getAddressLine(0);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            String s =  cityName;
    
            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            markerOptions.title(s);
            markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
    
            currentUserLocationMarker = mMap.addMarker(markerOptions);
    
            mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            mMap.animateCamera(CameraUpdateFactory.zoomBy(16));
    
            if (googleApiClient != null)
            {
                LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
            }
        }
    
        @Override
        public void onConnected(@Nullable Bundle bundle)
        {
            locationRequest = new LocationRequest();
            locationRequest.setInterval(1100);
            locationRequest.setFastestInterval(1100);
            locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
            {
                LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, (LocationListener) this);
            }
        }
    
        @Override
        public void onConnectionSuspended(int i) {
    
        }
    
        @Override
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2016-12-01
      相关资源
      最近更新 更多