Pourquoi est FusedLocationApi.getlastlocation null

j'essaie d'obtenir l'emplacement en utilisant FusedLocationApi.getLastLocation et j'ai les permissions d'emplacement dans le fichier de manifeste:

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

cependant, je reçois null quand je demande l'emplacement du système. J'étais juste en train de tester les services de désactivation et de localisation, donc ça peut être lié à ça (bien sûr, c'est activé quand j'essaie ça). Mais même après avoir retourné null, j'attends que onLocationChanged soit appelé et il n'est jamais appelé. J'ai également vu un similaire question ici: FusedLocationApi.getLastLocation always null

Voici mon code:

 protected LocationRequest createLocationRequest() {
    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(120000);
    mLocationRequest.setFastestInterval(30000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    return mLocationRequest;
}

protected GoogleApiClient getLocationApiClient(){
    return new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

LocationRequest locationRequest = createLocationRequest(); 

@Override
public void onLocationChanged(Location location) {
    App.setLocation(location); // NEVER CALLED
}

@Override
public void onConnected(Bundle bundle) {
    App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL
    LocationRequest locationRequest = createLocationRequest();
    LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this);
}

et sur onCreate de mon application:

locationApiClient = getLocationApiClient();
locationApiClient.connect();

this est l'objet de ma demande. Pourquoi est-ce que je suis nul (Oui, je do savoir qu'il peut être nul dans certaines circonstances rares comme indiqué dans les documents, mais je suis toujours obtenir ce, pas rarement) et toujours pas de localisation mise à jour par la suite? C'est un vrai appareil (Samsung Galaxy S3) sans carte SIM, si ça peut aider.

31
demandé sur Community 2015-04-22 14:41:34

13 réponses

j'utilise L'api FusedLocationProvider dans mon application, Voici mon code qui fonctionne à la fois sur le périphérique et l'émulateur -

  @Override
  protected void onCreate(Bundle savedInstanceState){
     //put your code here
     ....
     getLocation();

  }

 private void getLocation(){
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(LOCATION_INTERVAL);
    locationRequest.setFastestInterval(LOCATION_INTERVAL);
    fusedLocationProviderApi = LocationServices.FusedLocationApi;
    googleApiClient = new GoogleApiClient.Builder(this)
    .addApi(LocationServices.API)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .build();
    if (googleApiClient != null) {
        googleApiClient.connect();
    }
}


   @Override
   public void onConnected(Bundle arg0) {
        fusedLocationProviderApi.requestLocationUpdates(googleApiClient,  locationRequest, this);
   }

   @Override
   public void onLocationChanged(Location location) {
        Toast.makeText(mContext, "location :"+location.getLatitude()+" , "+location.getLongitude(), Toast.LENGTH_SHORT).show();
    }

c'est mon code de travail.

J'espère que mon code vous aidera.

santé..

19
répondu Ravi Bhandari 2017-08-07 04:57:00

le fournisseur d'emplacement fusionné ne conservera l'emplacement d'arrière-plan que si au moins un client y est connecté. Le simple fait d'activer le service de localisation ne garantit pas le stockage de la dernière localisation connue.

une fois que le premier client se connecte, il va immédiatement essayer d'obtenir un emplacement. Si votre activité est le premier client à se connecter et que getLastLocation() est invoquée immédiatement dans onConnected(), cela pourrait ne pas être suffisant pour que le premier emplacement arrive..

alors vous mettez mLocationRequest.setFastestInterval(30000); ce qui veut dire 30 secondes. ainsi, au moins 30 secondes après et généralement selon votre réglage, l'heure préférée est de 120 secondes, n'est-ce pas un très long temps s'il n'y a pas de dernier emplacement connu stocké du tout? de plus, vous réglez priorité équilibrée de la batterie, ce qui vous fera attendre plus longtemps.

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

je vous suggère de lancer Maps app d'abord, afin qu'il y ait au moins un endroit confirmé et puis test de votre application.

14
répondu Amit K. Saha 2017-03-10 06:47:25

si elle renvoie null, cela signifie que vous devez commencer à recevoir des mises à jour de localisation avec LocationServices.FusedLocationApi.requestLocationUpdates avant de récupérer l'emplacement.

pour moi, une solution au problème était d'appeler le:

LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient,locationRequest, this);

avant le:

App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient));

Le problème est que le dernier emplacement n'existe pas donc c'est nul.

Si le problème persiste, essayez ceci:

vérifiez les permissions nécessaires.

assurez-vous que vous avez activé la position sur votre appareil, puis redémarrez.

4
répondu Iris Veriris 2016-03-24 14:58:33

probablement, votre problème est où vous connectez le client, Je ne peux pas tester maintenant, mais comme google doc montre dans l'exemple, vous devriez connecter le client dans votre méthode onStart() dans l'activité.

    @Override
    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

Pour moi, ce getLocation travail

3
répondu Borja Alvarez 2015-04-23 06:36:39

avec android APILEVEL au-dessus de 23 vous avez besoin de quelques permissions d'exécution de temps. Service de localisation ACCESS_COARSE_LOCATION , ACCESS_FINE_LOCATION sont également nécessaires permissions.

consultez cette documentation https://developer.android.com/training/permissions/requesting.html

2
répondu user6596856 2016-07-16 23:35:16

je faisais face à la même question. Dans mon cas, le problème était d'autoriser les permissions pour l'application. J'avais refusé la permission D'emplacement amende qui a été demandé quand la première application a commencé.

essayez de désinstaller l'application de votre périphérique et de la redéployer. Il demandera à nouveau la permission. Permettre un accès aux données de localisation.

a Fonctionné dans mon cas !!

1
répondu Rishabh 2016-03-05 18:43:23

j'ai trouvé la solution.

j'étais en train de tester mon application sur un téléphone avec API 22 et ça marchait bien, cependant, sur API 17 location continuait à retourner null .

il s'avère que vous devez autoriser votre téléphone à utiliser les services de localisation de google. vous pouvez le faire en allant à Settings->Location Access->Check the "WLAN & mobile network location" (il pourrait être appelé différent dans une autre API). Sa ' description est la suivante:

laissez les applications utiliser Google service de localisation pour estimer votre localisation plus rapide. Les données de localisation anonymes seront collectées et envoyées à Google.

en l'activant, j'ai soudainement commencé à obtenir des données de localisation fusionnées dont j'avais tant besoin.

Espérons que cette aide!

1
répondu Starwave 2016-12-21 13:56:24

C'est la solution exacte. Mais je voulais ajouter quelques petites étapes d'explication pour que n'importe qui obtienne les concepts exacts. Pourquoi il est de retour nul, je suis d'accord pour suivre Amit K répondre. Mais, pour garantir que vous éviterez la NullPointerException de l'emplacement, vous démarrez votre traitement lié à l'emplacement à l'intérieur de la fonction onlocationchanged() callback.

1) onCreate() de Android Composant (par exemple, Activité , Fragment ou Service . Note: Not IntentService ), build et ensuite connect le GoogleApiClient comme ci-dessous.

buildGoogleApiClient();
mGoogleApiClient.connect();

où, buildGoogleApiClient() de la mise en œuvre est,

protected synchronized void buildGoogleApiClient() {
        Log.i(TAG, "Building GoogleApiClient");

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

    }

plus tard dans onDestroy (), vous pouvez déconnecter GoogleApiClient as,

@Override
    public void onDestroy() {
        Log.i(TAG, "Service destroyed!");
        mGoogleApiClient.disconnect();
        super.onDestroy();
    }

l'étape 1 s'assure que vous construisez et connectez le GoogleApiClient.

1) GoogleApiClient instance first time se connecte sur method onConnected(). Maintenant, votre prochaine étape devrait être la méthode onConnected ().

@Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.i(TAG, "GoogleApiClient connected!");
        buildLocationSettingsRequest();
        createLocationRequest();
        location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        Log.i(TAG, " Location: " + location); //may return **null** because, I can't guarantee location has been changed immmediately 
    }

ci-dessus, vous avez appelé une méthode createLocationRequest() pour créer une requête de localisation. La méthode createLocationRequest () ressemble ci-dessous.

protected void createLocationRequest() {
        //remove location updates so that it resets
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); //Import should not be **android.Location.LocationListener**
    //import should be **import com.google.android.gms.location.LocationListener**;

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(5000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        //restart location updates with the new interval
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

    }

3) maintenant, sur onLocationChange() Rappel de L'interface LocationListener, vous obtenez un nouvel emplacement.

@Override
    public void onLocationChanged(Location location) {
        Log.i(TAG, "Location Changed!");
        Log.i(TAG, " Location: " + location); //I guarantee of change of location here.


    }

vous obtenez le résultat comme ceci dans Logcat: 03-22 18:34: 17.336 817-817/com.LiveEarthquakesAlerts I / LocationTracker: Location: Location [fused 37.421998, -122.084000 acc=20 et = +15m35s840ms alt = 0.0]

Note: l'emplacement au-dessus de got est L'emplacement du siège de Google bien que je suis en Arkansas. Cela se produit lorsque vous utilisez L'émulateur. Sur l'appareil réel, il montre la bonne adresse.

pour pouvoir faire ces trois étapes, vous devez avoir configuré votre build.gradle comme ci-dessous:

 compile 'com.google.android.gms:play-services-location:10.2.1'
1
répondu Uddhav Gautam 2017-07-25 15:29:05

Essayez cette,

    private static int UPDATE_INTERVAL = 10000; // 10 sec
    private static int FATEST_INTERVAL = 5000; // 5 sec
    private static int DISPLACEMENT = 10; // 10 meters


   private void createLocationRequest() {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FATEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
  }

 @Override
    public void onConnected(@Nullable Bundle bundle) {
        mLastLocation = LocationServices.FusedLocationApi
            .getLastLocation(mGoogleApiClient);
       if(mLastLocation == null){
           LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
    }
0
répondu Kishan Vaghela 2016-05-30 05:43:29

vérifiez dans votre appareil si vous avez activé l'emplacement ou non.

Vous pouvez l'activer à partir de Panneau de Notification ou de Paramètres :

Paramètres - > Personnel - > Emplacement

j'ai utilisé seulement la permission qui est :

ACCESS_FINE_LOCATION

mon code de travail est:

package com.go.findlocation;

import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;

public class MainActivity extends AppCompatActivity implements     GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, LocationListener {

private GoogleApiClient mGoogleApiClient = null;
//private Location mLocation = null;
private LocationManager mLocationManager = null;
private LocationRequest mLocationRequest = null;

private TextView tv1 = null;
private TextView tv2 = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mLocationRequest = new LocationRequest();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(7000);
    mLocationRequest.setSmallestDisplacement(1);

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();

    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    tv1 = (TextView) findViewById(R.id.tv1);
    tv2 = (TextView) findViewById(R.id.tv2);
}

@Override
public void onConnected(@Nullable Bundle bundle) {

    Log.d("abc", "def");

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    Log.d("ghi", "jkl");

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

    Log.d("connected", String.valueOf(mGoogleApiClient.isConnected()));

   /* if (mLocation != null) {
        tv1.setText(String.valueOf(mLocation.getLatitude()));
        tv2.setText(String.valueOf(mLocation.getLongitude()));
    } else
        Toast.makeText(this, "mLocation is null", Toast.LENGTH_SHORT).show();*/
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override
protected void onStart() {

    mGoogleApiClient.connect();
    super.onStart();
}

@Override
protected void onStop() {

    if (mGoogleApiClient.isConnected())
        mGoogleApiClient.disconnect();
    super.onStop();
}

@Override
public void onLocationChanged(Location location) {

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }

    Log.d("mno",String.valueOf(mGoogleApiClient.isConnected()));

if (location != null)
    {
        tv1.setText(String.valueOf(location.getLatitude()));
        tv2.setText(String.valueOf(location.getLongitude()));
        Toast.makeText(this, location.getLatitude()+" "+location.getLongitude(), Toast.LENGTH_SHORT).show();
    }
    else
        Toast.makeText(this, "location is null", Toast.LENGTH_SHORT).show();
}
}
0
répondu Dhruvam Gupta 2016-10-06 07:26:21

a fait face à un problème similaire il y a 30min, le code était en cours d'exécution avant le nouveau simulateur. Après avoir changé lat lng du simulateur il a commencé à fonctionner à nouveau

0
répondu kemalony 2017-05-11 09:49:49

Je ne pense pas que ce soit un problème de codage.

semble que le fournisseur d'emplacement de l'appareil ait des difficultés à préciser l'emplacement à l'heure proposée, et la méthode locationChanged() n'est jamais appelée.

vérifiez si la configuration de l'appareil vers les services de localisation n'est pas sélectionnée avec un mode de localisation plus dur (comme GPS seulement).

si c'est le cas, votre code ne peut pas déterminer votre position par GPS si vous êtes à l'intérieur (comme je suppose que vous l'êtes). Choisir l'option Haute Précision et vos problèmes seront résolus.

0
répondu Renascienza 2017-06-20 13:09:17

J'ai utilisé FusedAPI et ci-dessous le code fonctionne pour moi... Essai dans le dispositif réel

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Looper;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.PermissionChecker;
import android.widget.ProgressBar;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.google.android.gms.location.SettingsClient;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnCanceledListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;

import java.util.ArrayList;
import java.util.LinkedHashMap;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<LocationSettingsResult> {

    private static final int REQUEST_CHECK_SETTINGS = 214;
    private static final int REQUEST_ENABLE_GPS = 516;
    private final int REQUEST_LOCATION_PERMISSION = 214;
    protected GoogleApiClient mGoogleApiClient;
    protected LocationSettingsRequest mLocationSettingsRequest;
    /* For Google Fused API */
    private FusedLocationProviderClient mFusedLocationClient;
    private SettingsClient mSettingsClient;
    private LocationCallback mLocationCallback;
    private LocationRequest mLocationRequest;
    private Location mCurrentLocation;
    /* For Google Fused API */
    private Context context;
    private ProgressBar progressBar;
    private AsyncTask task;
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        try {
            int permissionCheck = PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                Helper.showLog("Permission is already allowed. Build Client");
                buildGoogleApiClient();
            } else {
                Helper.showLog("Permission is requested");
                ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    protected synchronized void buildGoogleApiClient() {
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        mSettingsClient = LocationServices.getSettingsClient(this);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        connectGoogleClient();

        mLocationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
                Helper.showLog("Location Received");
                mCurrentLocation = locationResult.getLastLocation();
                onLocationChanged(mCurrentLocation);
            }
        };
    }

    private void connectGoogleClient() {
        GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
        int resultCode = googleAPI.isGooglePlayServicesAvailable(this);
        if (resultCode == ConnectionResult.SUCCESS) {
            mGoogleApiClient.connect();
        } else {
            int REQUEST_GOOGLE_PLAY_SERVICE = 988;
            googleAPI.getErrorDialog(this, resultCode, REQUEST_GOOGLE_PLAY_SERVICE);
        }
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(30 * 1000);
        mLocationRequest.setFastestInterval(5 * 1000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

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

        mSettingsClient
                .checkLocationSettings(mLocationSettingsRequest)
                .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
                    @Override
                    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                        Helper.showLog("GPS Success");
                        requestLocationUpdate();
                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                int statusCode = ((ApiException) e).getStatusCode();
                switch (statusCode) {
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        try {
                            ResolvableApiException rae = (ResolvableApiException) e;
                            rae.startResolutionForResult(MapsActivity.this, REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException sie) {
                            Helper.showLog("PendingIntent unable to execute request.");
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        Helper.showLog("Location settings are inadequate, and cannot be fixed here. Fix in Settings.");
                }
            }
        }).addOnCanceledListener(new OnCanceledListener() {
            @Override
            public void onCanceled() {
                Helper.showLog("checkLocationSettings -> onCanceled");
            }
        });
    }

    @Override
    public void onConnectionSuspended(int i) {
        connectGoogleClient();
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        buildGoogleApiClient();
    }

    @Override
    public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {

    }

    @Override
    public void onLocationChanged(Location location) {
        String latitude = String.valueOf(location.getLatitude());
        String longitude = String.valueOf(location.getLongitude());

        if (latitude.equalsIgnoreCase("0.0") && longitude.equalsIgnoreCase("0.0")) {
            requestLocationUpdate();
        } else {
            //Perform Your Task with LatLong
        }
    }

    @SuppressLint("MissingPermission")
    private void requestLocationUpdate() {
        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
    }

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

        if (requestCode == REQUEST_CHECK_SETTINGS) {
            switch (resultCode) {
                case Activity.RESULT_OK:
                    Helper.showLog("User allow to access location. Request Location Update");
                    requestLocationUpdate();
                    break;
                case Activity.RESULT_CANCELED:
                    Helper.showLog("User denied to access location.");
                    openGpsEnableSetting();
                    break;
            }
        } else if (requestCode == REQUEST_ENABLE_GPS) {
            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            if (!isGpsEnabled) {
                openGpsEnableSetting();
            } else {
                requestLocationUpdate();
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == REQUEST_LOCATION_PERMISSION) {
            int permissionCheck = PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                Helper.showLog("User Allowed Permission Build Google Client");
                buildGoogleApiClient();
            } else {
                Helper.showLog("User Denied Permission");
            }
        }

    }

    private void openGpsEnableSetting() {
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, REQUEST_ENABLE_GPS);
    }

    @Override
    protected void onDestroy() {
        //Remove location update callback here
        mFusedLocationClient.removeLocationUpdates(mLocationCallback);
        super.onDestroy();
    }
}

Classe Helper

public class Helper {
    public static void showLog(String message) {
        Log.e("Ketan", "" + message);
    }

    public static void showToast(Context context, String message) {
        Toast.makeText(context, "" + message, Toast.LENGTH_SHORT).show();
    }
}

Peut Aider À

0
répondu Ketan Ramani 2018-09-28 05:05:08