Проблема с разрешением местоположения во время выполнения - PullRequest
0 голосов
/ 20 января 2020

Я создаю приложение, в котором мне нужно показать текущее местоположение пользователя на карте. Так что для этого, во-первых, проблема, с которой я столкнулся, была, когда пользователь входил в приложение, если его местоположение отключено, я запросил разрешение на включение местоположения, и даже после того, как пользователь дал мне разрешение, я все еще получаю нулевое значение в моем местоположении местоположения. функция и я получаю местоположение после того, как пользователь перезапустит приложение. Я получаю разрешение в spla sh, поэтому для этой проблемы перезапуска я сделал в spla sh Iam, перезапускающий активность в onActivityResult, вот так:

      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

  displayLocationSettingsRequest();
        }


        private void displayLocationSettingsRequest() {
            GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API).build();
            googleApiClient.connect();

            LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            locationRequest.setInterval(10000);
            locationRequest.setFastestInterval(10000 / 2);

            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
            builder.setAlwaysShow(true);

            PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
            result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                @Override
                public void onResult(LocationSettingsResult result) {
                    final Status status = result.getStatus();
                    switch (status.getStatusCode()) {
                        case LocationSettingsStatusCodes.SUCCESS:
                            startActivity(new Intent(getApplicationContext(), LoginActivity.class));
                            finish();
                            break;
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

                            try {

                                status.startResolutionForResult(SplashActivity.this, 7);
                            } catch (IntentSender.SendIntentException e) {
                                Toast.makeText(SplashActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            Toast.makeText(SplashActivity.this, "Location settings are inadequate, and cannot be fixed here. Dialog not created.", Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            });
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == 7 && resultCode == RESULT_OK && data != null) {
                finish();
                overridePendingTransition(0, 0);
                startActivity(getIntent());
                overridePendingTransition(0, 0);
                Toast.makeText(this, "entering", Toast.LENGTH_SHORT).show();

            } else {
                Toast.makeText(this, "To continue please give permission for location", Toast.LENGTH_LONG).show();
                displayLocationSettingsRequest();
            }
        }


        @Override
        protected void onRestart() {
            super.onRestart();

            if (ConnectivityReceiver.isNetworkConnected(this)) {
               displayLocationSettingsRequest();
            } else {
                HelperClass.openAlertDialog(SplashActivity.this, Constants.alert, Constants.No_Internet_Msg, Constants.try_again, Constants.Dialog_cancel, this);
            }
        }
    }

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

Это мой класс Location:

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
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60; // 1 minute
    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);
            if (locationManager != null) {
                isGPSEnabled = locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER);
            }
            if (locationManager != null) {
                isNetworkEnabled = locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER);
            }

            if (isGPSEnabled || isNetworkEnabled) {

                this.canGetLocation = true;

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

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



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


    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude() ;

        }
    }

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

А здесь в моем месте получения MainActivity Iam:

protected void setupLocation() {

        if (locManager == null)
            locManager = new LocationUtil(MainActivity.this);
        if (locManager.getLocation() != null) {
            locationHelper = new LocationHelper(locManager.getLocation().getLatitude(), locManager.getLocation().getLongitude());
            latitude = locationHelper.getLatitude();
            longitude = locationHelper.getLongitude();

        } else {
            Toast.makeText(getApplicationContext(), "Please accept location improvement dialog or restart the application!", Toast.LENGTH_LONG).show();
           startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        }
    }

ПРИМЕЧАНИЕ. Я получаю lat long, но проблема возникает в разрешении, если перед запуском приложения местоположение отключено и я включаю приложение, оно даст мне нулевое значение и Я должен перезапустить приложение.

...