Простой и лучший способ узнать текущее местоположение или последнее известное местоположение пользователя - PullRequest
0 голосов
/ 22 января 2020

Я знаю, что есть много вопросов по этому поводу, и многие люди ответили на это. Я также реализовал класс и получил местоположение, но мои настройки немного отличаются и критичны. Я создаю приложение, в котором местоположение очень важно, я должен получить пользовательскую широту долготы всеми правдами и неправдами. Класс, который я использую прямо сейчас, чтобы получить местоположение пользователя, иногда пропускает местоположение, и в данный момент он не получает местоположение по Wi-Fi, я должен объединить мобильные данные, чтобы получить местоположение пользователя

Вот класс:

/* Created by Umair */
public class LocationUtil implements LocationListener {

    private final Context mContext;
    // flag for GPS status
    private boolean isGPSEnabled = false;
    // flag for network status
    private boolean isNetworkEnabled = false;
    // flag for GPS status
    private boolean canGetLocation = false;
    private Location location; // location
    private double latitude; // latitude
    private double longitude; // longitude
    // 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 minute
    // Declaring a Location Manager
    private android.location.LocationManager locationManager;

    public LocationUtil() {
        this.mContext = null;
    }


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

    public Location getLocation() {
        try {
            locationManager = (android.location.LocationManager) mContext.getSystemService(LOCATION_SERVICE);
            // getting GPS status
            if (locationManager != null) {
                isGPSEnabled = locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER);
            }
            // getting network status
            if (locationManager != null) {
                isNetworkEnabled = locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER);
            }

            if (isGPSEnabled || isNetworkEnabled) {

                this.canGetLocation = true;

                // First get location from Network Provider
                if (isNetworkEnabled) {
                    if (ActivityCompat.checkSelfPermission(this.mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this.mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                    }
                    locationManager.requestLocationUpdates(android.location.LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(android.location.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) {
                        if (locationManager != null) {
                            locationManager.requestLocationUpdates(android.location.LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        }
                        if (locationManager != null) {
                            location = locationManager.getLastKnownLocation(android.location.LocationManager.GPS_PROVIDER);

                            if (location != null) {
                                latitude = location.getLatitude() ;
                                longitude = location.getLongitude() ;

                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        stopUsingGPS();
        return location;
    }

    private void stopUsingGPS() {
        if (locationManager != null) {
            locationManager.removeUpdates(LocationUtil.this);
        }
    }


    public double getLatitude() {
        if (location != null) {
            latitude = location.getLatitude();
        }
        // return latitude
        return latitude;
    }

    public double getLongitude() {
        if (location != null) {
            longitude = location.getLongitude();
        }
        // return longitude
        return longitude;
    }

    public boolean canGetLocation() {
        return this.canGetLocation;
    }


    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

    public static boolean getLocationMode(Context context) {
        try {
            return Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE) == 3;
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }

Что мое требование - не пускать пользователя в приложение, если он не дал разрешения на определение местоположения, а я делаю это на spla sh, но проблема возникла после того, как пользователь дал Разрешение Я должен перезапустить приложение снова, иначе оно будет go на следующем экране, но не получит местоположение. Я должен определить местоположение пользователя по любой возможной доступной сети. Проще говоря, если пользователь в приложении не должен пропустить его местоположение, так как через некоторое время возникла проблема, сеть не доступна или пользователь находится где-то, где сигнал очень слабый. В моем Требование Я хочу знать простой и лучший способ получить местоположение пользователя или его последнее известное местоположение в этом приложении.

...