web-dev-qa-db-fra.com

LocationCallback ne reçoit pas d'appel

Je fais une demande de localisation en utilisant FusedLocationProviderClient. J'ai gardé une minuterie pendant 30 secondes pour vérifier si la position est reçue dans ce délai. Le code est ci-dessous:

 public void requestLocationUpdates() {
    initializeLocationRequest();
    mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
    startTimer();
}

 private void initializeLocationRequest() {
    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(mContext);
    mLocationRequest = new LocationRequest();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(5000);
    mLocationRequest.setFastestInterval(5000);

    mLocationCallback = new LocationCallback() {

        @Override
        public void onLocationResult(LocationResult locationResult) {
            synchronized (SilentCurrentLocationProvider.this) {
                super.onLocationResult(locationResult);
                Location location = locationResult.getLastLocation();
        }
    };
}

  private void startTimer() {
    if (mTimeout < 1) {
        mTimeout = mDefaultTimeout;
    }
    mTimer = new Timer();   
    mTimer.schedule(new LocationTimer(), mTimeout * 1000);
}

Sur quelques appareils, l'emplacement ne vient pas. En déboguant plus loin, j'ai trouvé que LocationRequest et LocationCallback sont en cours de création, mais cela ne vient pas à l'intérieur de la méthode onLocationResult ().

Comme cela fait partie d'un produit en direct, il est difficile de déboguer sur chaque appareil. Même moi, j'ai essayé de redémarrer le téléphone, mais cela ne fonctionne pas. L'utilisateur a essayé d'autres applications comme Ola et l'emplacement y arrivait.

Des autorisations de localisation ont également été accordées.

Quelqu'un peut-il me dire les raisons possibles de ce problème?

16
TechieLover12

J'étais confronté à ce même problème. Dans mon cas, la méthode/précision de localisation de l'appareil a été définie sur téléphone uniquement plutôt que haute précision ou économie de batterie. Modifiez les paramètres en Haute précision et recevez des rappels sur locationCallback.

3
Rohit Sharma

Nous avons eu le même problème sur les mobiles avec Android Pie. La permission de localisation a été accordée (manuellement en allant dans les paramètres de l'application) et la localisation était activée avec une grande précision mais n'obtenait pas de mises à jour de localisation. code ajouté pour vérifier si l'autorisation de localisation a été accordée avant de demander des mises à jour de localisation.

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted. Request for permission
}
1
Arun

Cela m'est arrivé lorsque l'emplacement a été désactivé. Pas l'autorisation de localisation pour l'application, mais l'emplacement de l'appareil Android lui-même. Demander à l'utilisateur d'activer le GPS l'a corrigé pour moi:

protected void onCreate(Bundle savedInstanceState) {
    //...
    final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );

    if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
        buildAlertMessageNoGps();
    }
}

private void buildAlertMessageNoGps() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
            .setCancelable(false)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                    startActivity(new Intent(Android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                    dialog.cancel();
                }
            });
    final AlertDialog alert = builder.create();
    alert.show();
}

Solution de ici .

Vous devrez peut-être également éteindre puis rallumer le GPS pour déclencher une boîte de dialogue afin d'améliorer la précision de la localisation:

Dialog prompting to improve location accuracy

0
jon

Vous devez demander uniquement l'autorisation suivante:

Manifest.permission.ACCESS_FINE_LOCATION

J'ai eu le même problème et je demandais les deux autorisations avec:

Manifest.permission.ACCESS_COARSE_LOCATION

Lorsque j'ai supprimé COARSE LOCATION, j'ai reçu la mise à jour presque immédiatement.

0
Santiago Carrillo