Расположение FusedLocationProvideClient всегда нулевое - PullRequest
0 голосов
/ 15 апреля 2020

Я добавил этот метод в класс MainActivity.

private void setupLocationClient() {
        FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(2000);

        mFusedLocationClient.getLastLocation()
                .addOnSuccessListener(location -> {
                    if (location != null) {
                        double wayLatitude = location.getLatitude();
                        double wayLongitude = location.getLongitude();
                        Toast.makeText(MainActivity.this,
                                String.format(Locale.getDefault(), "%f -- %f", wayLatitude, wayLongitude), Toast.LENGTH_LONG)
                                .show();
                    }
                });

        LocationCallback locationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if (locationResult == null) {
                    return;
                }
                for (Location location : locationResult.getLocations()) {
                    if (location != null) {
                        double wayLatitude = location.getLatitude();
                        double wayLongitude = location.getLongitude();
                        Toast.makeText(MainActivity.this,
                                String.format(Locale.getDefault(), "%f -- %f", wayLatitude, wayLongitude), Toast.LENGTH_LONG)
                                .show();
                    }
                }
            }
        };



         mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());
}

Мне потребовались эти разрешения.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

Когда я отлаживаю код, обратный вызов никогда не достигается и один запрос поскольку местоположение всегда равно нулю.

Я запросил эти разрешения в основной деятельности.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||
                        this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    this.requestPermissions(
                            new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                            Constants.PERMISSIONS_LOCATION_CODE
                    );
                } else {
                    setupLocationClient();
                }
            } else {
                setupLocationClient();
            }

1 Ответ

3 голосов
/ 15 апреля 2020

Не забудьте добавить ниже зависимость для местоположения

внедрение 'com.google. android .gms: play-services-location: 17.0.0'

А также необходимо требовать оба разрешения для местоположения выборки

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mSettingsClient = LocationServices.getSettingsClient(this);

    mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            super.onLocationResult(locationResult);
            // location is received
            mCurrentLocation = locationResult.getLastLocation();
            mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());

            updateLocationUI();
        }
    };

    mRequestingLocationUpdates = false;

    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
    builder.addLocationRequest(mLocationRequest);
    mLocationSettingsRequest = builder.build();
}

/**
 * Restoring values from saved instance state
 */
private void restoreValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        if (savedInstanceState.containsKey("is_requesting_updates")) {
            mRequestingLocationUpdates = savedInstanceState.getBoolean("is_requesting_updates");
        }

        if (savedInstanceState.containsKey("last_known_location")) {
            mCurrentLocation = savedInstanceState.getParcelable("last_known_location");
        }

        if (savedInstanceState.containsKey("last_updated_on")) {
            mLastUpdateTime = savedInstanceState.getString("last_updated_on");
        }
    }

    updateLocationUI();
}


/**
 * Update the UI displaying the location data
 * and toggling the buttons
 */
private void updateLocationUI() {
    if (mCurrentLocation != null) {
        txtLocationResult.setText(
                "Lat: " + mCurrentLocation.getLatitude() + ", " +
                        "Lng: " + mCurrentLocation.getLongitude()
        );


    }

}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("is_requesting_updates", mRequestingLocationUpdates);
    outState.putParcelable("last_known_location", mCurrentLocation);
    outState.putString("last_updated_on", mLastUpdateTime);

}
/**
 * Starting location updates
 * Check whether location settings are satisfied and then
 * location updates will be requested
 */
private void startLocationUpdates() {
    mSettingsClient
            .checkLocationSettings(mLocationSettingsRequest)
            .addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
                @SuppressLint("MissingPermission")
                @Override
                public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                    Log.i(TAG, "All location settings are satisfied.");

                    Toast.makeText(getApplicationContext(), "Started location updates!", Toast.LENGTH_SHORT).show();

                    //noinspection MissingPermission
                    mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                            mLocationCallback, Looper.myLooper());

                    updateLocationUI();
                }
            })
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    int statusCode = ((ApiException) e).getStatusCode();
                    switch (statusCode) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
                                    "location settings ");
                            try {
                                // Show the dialog by calling startResolutionForResult(), and check the
                                // result in onActivityResult().
                                ResolvableApiException rae = (ResolvableApiException) e;
                                rae.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                            } catch (IntentSender.SendIntentException sie) {
                                Log.i(TAG, "PendingIntent unable to execute request.");
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            String errorMessage = "Location settings are inadequate, and cannot be " +
                                    "fixed here. Fix in Settings.";
                            Log.e(TAG, errorMessage);

                            Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show();
                    }

                    updateLocationUI();
                }
            });
}



    // Requesting ACCESS_FINE_LOCATION using Dexter library
    Dexter.withActivity(this)
            .withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
            .withListener(new PermissionListener() {
                @Override
                public void onPermissionGranted(PermissionGrantedResponse response) {
                    mRequestingLocationUpdates = true;
                    startLocationUpdates();
                }

                @Override
                public void onPermissionDenied(PermissionDeniedResponse response) {
                    if (response.isPermanentlyDenied()) {
                        // open device settings when the permission is
                        // denied permanently
                        openSettings();
                    }


                @Override
                public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                    token.continuePermissionRequest();
                }
            }).check();
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        // Check for the integer request code originally supplied to startResolutionForResult().
        case REQUEST_CHECK_SETTINGS:
            switch (resultCode) {
                case Activity.RESULT_OK:
                    Log.e(TAG, "User agreed to make required location settings changes.");
                    // Nothing to do. startLocationupdates() gets called in onResume again.
                    break;
                case Activity.RESULT_CANCELED:
                    Log.e(TAG, "User chose not to make required location settings changes.");
                    mRequestingLocationUpdates = false;
                    break;
            }
            break;
    }
}

private void openSettings() {
    Intent intent = new Intent();
    intent.setAction(
            Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package",
            BuildConfig.APPLICATION_ID, null);
    intent.setData(uri);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

@Override
public void onResume() {
    super.onResume();

    // Resuming location updates depending on button state and
    // allowed permissions
    if (mRequestingLocationUpdates && checkPermissions()) {
        startLocationUpdates();
    }

    updateLocationUI();
}

private boolean checkPermissions() {
    int permissionState = ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION);
    return permissionState == PackageManager.PERMISSION_GRANTED;
}


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

    if (mRequestingLocationUpdates) {
        // pausing location updates
        stopLocationUpdates();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...