webentwicklung-frage-antwort-db.com.de

Warum ist FusedLocationApi.getLastLocation null?

Ich versuche den Speicherort mithilfe von FusedLocationApi.getLastLocation abzurufen, und ich habe die Standortberechtigungen in der Manifestdatei:

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

Ich erhalte jedoch null, wenn ich den Speicherort vom System abfrage. Ich habe gerade die Ausschalt- und Vor-Ort-Dienste getestet, daher könnte es damit zusammenhängen (natürlich ist es eingeschaltet, wenn ich dies versuche). Aber selbst nachdem ich null zurückgegeben habe, warte ich auf den Aufruf von onLocationChanged und es wird nie aufgerufen. Ich habe auch eine ähnliche Frage hier gesehen: FusedLocationApi.getLastLocation immer null

Hier ist mein 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);
}

Und auf onCreate meiner App:

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

Wo this ist mein Anwendungsobjekt . Warum bekomme ich null (ja, ich do weiß, dass es in einigen seltenen Fällen null sein kann, wie in den Dokumenten angegeben, aber ich erhalte dies IMMER, nicht selten) und erhalten danach keine Standortaktualisierungen mehr? Es ist ein echtes Gerät (Samsung Galaxy S3) ohne SIM-Karte, wenn es hilft.

33
Can Poyrazoğlu

Ich verwende FusedLocationProvider-API in meiner App... 

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

das ist mein arbeitscode.

Hoffe, dass mein Code dir hilft.

Prost..

18
Ravi Bhandari

Der Anbieter für abgesicherte Standorte behält den Hintergrund im Hintergrund nur bei, wenn mindestens ein Client mit ihm verbunden ist. Wenn Sie nur den Ortungsdienst einschalten, kann nicht garantiert werden, dass der letzte bekannte Ort gespeichert wird. 

Sobald der erste Client eine Verbindung hergestellt hat, versucht er sofort, einen Standort zu ermitteln. Wenn Ihre Aktivität der erste Client ist, der eine Verbindung herstellt und getLastLocation () sofort in onConnected () aufgerufen wird, reicht dies möglicherweise nicht aus, um den ersten Standort zu erreichen.

Dann stellen Sie mLocationRequest.setFastestInterval(30000); ein, was im Grunde 30 Sekunden bedeutet. Mindestens 30 Sekunden nach und im Allgemeinen beträgt Ihre bevorzugte Zeit 120 Sekunden. Ist es nicht eine sehr lange Zeit, wenn kein letzter bekannter Ort gespeichert ist? Außerdem stellen Sie die Priorität der Batteriebalance ein, wodurch Sie länger warten müssen.

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

Ich empfehle Ihnen, zuerst die Maps-App zu starten, sodass mindestens ein bestätigter Speicherort vorhanden ist, und testen Sie dann Ihre App. 

17
Amit K. Saha

Wenn null zurückgegeben wird, müssen Sie Standortaktualisierungen mit LocationServices.FusedLocationApi.requestLocationUpdates empfangen, bevor Sie den Standort abrufen können.

Eine Lösung für das Problem war für mich:

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

vor dem:

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

Das Problem ist, dass der letzte Speicherort nicht vorhanden ist und daher null ist.

Wenn das Problem weiterhin besteht, versuchen Sie Folgendes:

Überprüfen Sie die erforderlichen Berechtigungen.

Stellen Sie sicher, dass Sie die Position auf Ihrem Gerät aktiviert haben, und starten Sie dann neu.

4
Iris Veriris

Wahrscheinlich liegt Ihr Problem darin, dass Sie den Client verbinden. Ich kann es jetzt nicht testen. Wie Google Doc im Beispiel zeigt, sollten Sie den Client in Ihrer onStart()-Methode der Aktivität verbinden.

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

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

Das macht getLocation für mich

3
Borja Alvarez

Mit Android APILEVEL über 23 benötigen Sie einige Laufzeitberechtigungen. Der Standortdienst ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION benötigt ebenfalls Berechtigungen. 

Überprüfen Sie diese Dokumentation https://developer.Android.com/training/permissions/requesting.html

2
user6596856

Dies ist die genaue Lösung. Aber ich wollte einige kleine Erklärungsschritte hinzufügen, damit jeder die genauen Konzepte bekommt. Warum es null zurückgibt, stimme ich der Antwort von Amit K zu. Um jedoch das Vermeiden der NullPointerException-Position zu gewährleisten, starten Sie die standortbezogene Verarbeitung in onLocationChanged () - Rückruf. 

1) onCreate () der Android-Komponente (z. B. Activity , Fragment oder Service . Hinweis: Nicht IntentService), build und dann connect den GoogleApiClient wie folgt.

buildGoogleApiClient();
mGoogleApiClient.connect();

wo ist die buildGoogleApiClient () Implementierung,

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

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

    }

Später bei onDestroy () können Sie GoogleApiClient trennen als

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

Der Schritt 1 stellt sicher, dass Sie den GoogleApiClient erstellen und verbinden.

1) Die GoogleApiClient-Instanz wird zum ersten Mal mit der Methode onConnected () verbunden. Jetzt sollte der nächste Schritt mit der Methode "Connected ()" aussehen. 

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

Oben haben Sie eine Methode createLocationRequest () aufgerufen, um eine Standortanfrage zu erstellen. Die Methode createLocationRequest () sieht wie folgt aus.

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) Beim Aufruf von onLocationChange () der LocationListener-Schnittstelle erhalten Sie jetzt einen neuen Speicherort.

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


    }

Sie erhalten das Ergebnis in Logcat folgendermaßen: 03-22 18: 34: 17.336 817-817/com.LiveEarthquakesAlerts I/LocationTracker: Location: Location [abgesichert 37.421998, -122.084000 acc = 20 et = + 15m35s840ms alt = 0.0]

Hinweis: Der oben genannte Standort ist der Standort des Google-Hauptsitzes, obwohl ich in Arkansas bin. Dies geschieht, wenn Sie den Emulator verwenden. Auf einem realen Gerät wird die korrekte Adresse angezeigt. 

Um diese drei Schritte ausführen zu können, müssen Sie Ihr build.gradle wie folgt konfiguriert haben:

 compile 'com.google.Android.gms:play-services-location:10.2.1'
2
Uddhav Gautam

Ich stand vor demselben Problem. In meinem Fall bestand das Problem darin, die Berechtigungen für die Anwendung zuzulassen. Ich hatte die Berechtigung FINE LOCATION abgelehnt, die beim ersten Start der App abgefragt wurde.

Deinstallieren Sie die App von Ihrem Gerät und stellen Sie sie erneut bereit. Es wird erneut um Erlaubnis gefragt. Erlaube feinen Standortzugang.

Hat in meinem Fall gearbeitet !!

1
Rishabh

Ich habe die Lösung gefunden. 

Ich testete meine App auf einem Telefon mit API 22, und es funktionierte gut, auf der API 17-Position kehrte jedoch null zurück.

Wie sich herausgestellt hat, müssen Sie Ihrem Telefon die Verwendung von Google Location Services erlauben. Sie können dies tun, indem Sie zu Settings->Location Access->Check the "WLAN & mobile network location" wechseln (dies kann in einer anderen API anders genannt werden). Die Beschreibung lautet:

Lassen Sie Apps den Standortdienst von Google verwenden, um Ihren Standort abzuschätzen schneller. Anonyme Standortdaten werden erfasst und an Google gesendet.

Durch die Aktivierung erhielt ich plötzlich dringend benötigte Standortdaten.

Hoffe das hilft!

1
Starwave

Ich denke nicht, dass dies ein Codierungsproblem ist.

Es scheint, dass der Gerätestandortanbieter Schwierigkeiten hat, den Ort zum vorgeschlagenen Zeitpunkt zu bestimmen, und die locationChanged () -Methode wird nie aufgerufen.

Prüfen Sie, ob die Gerätekonfiguration für Standortdienste nicht mit einem härteren Standortmodus (wie nur GPS) ausgewählt ist.

Wenn dies der Fall ist, kann Ihr Code Ihre Position nicht per GPS bestimmen, wenn Sie sich im Innenbereich befinden (wie ich denke, Sie sind es). Wählen Sie die Option Hohe Genauigkeit und Ihre Probleme werden gelöst.

1
Renascienza

Versuche dies,

    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
Kishan Vaghela

vor 30 Minuten vor einem ähnlichen Problem, lief der Code vor dem neuen Simulator ..__

0
kemalony

Prüfen Sie in Ihrem Gerät, ob Sieden Ortaktiviert haben oder nicht. 

Sie können es entweder überNotification Paneloder überSettingsals aktivieren:

Einstellungen -> Persönlich -> Standort

Ich habe nur die Erlaubnis verwendet, nämlich:

ACCESS_FINE_LOCATION

Mein Arbeitscode ist:

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
Dhruvam Gupta

Ich habe gerade eine Entdeckung gemacht, vielleicht hilft es einigen von Ihnen. Ich habe null von getLastLocation () erhalten und es stellte sich heraus, dass ich versucht habe, die Position nur mit eingeschaltetem GPS zu ermitteln, aber anscheinend muss auch Wi-Fi aktiviert sein (auch wenn nicht mit einem Netzwerk verbunden). Ich frage mich, ob das mein Gerätefehler ist (Samsung Tablet) ... Ich beschäftige mich mehr mit dem Thema, aber bis jetzt wurde nichts gefunden. Ich würde mich freuen, wenn jemand mehr über dieses Problem erfahren würde.

0
laszlo

Ich habe FusedAPI verwendet und der folgende Code funktioniert für mich ... Test in Real-Gerät

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

Hilfsklasse

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

Mai Hilfe

0
Ketan Ramani