Warum ist FusedLocationApi.getLastLocation null?

Lesezeit: 11 Minuten

Warum ist FusedLocationApigetLastLocation null
Kann Poyrazoğlu

Ich versuche, den Standort zu ermitteln, indem ich verwende FusedLocationApi.getLastLocation 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" />

Allerdings bekomme ich null wenn ich den Standort vom System abfrage. Ich habe gerade das Ein- und Ausschalten von Ortungsdiensten getestet, also kann es damit zusammenhängen (natürlich ist es eingeschaltet, wenn ich dies versuche). Aber auch nach der Rückgabe von null warte ich auf onLocationChanged angerufen werden und es wird nie angerufen. Ich habe hier auch eine ähnliche Frage 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 weiter onCreate meiner App:

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

Wo this ist mein Anwendungsobjekt. Warum bekomme ich null (ja, ich tun wissen, dass es unter einigen seltenen Umständen null sein kann, wie in den Dokumenten angegeben, aber ich bekomme das IMMER, nicht selten) und Bekomme danach immer noch keine Standortaktualisierungen? Es ist ein echtes Gerät (Samsung Galaxy S3) ohne SIM-Karte, wenn es hilft.

  • Es gibt keine ACCESS_GPS oder ACCESS_LOCATION Berechtigungen in Android. Darüber hinaus ist es sehr schwierig, Ihnen ohne Code zu helfen.

    – CommonsWare

    22. Apr. ’15 um 11:42


  • @CommonsWare Ich weiß sowieso nicht, wie ich dazu gekommen bin, es sollte das Verhalten nicht beeinflussen.

    – Kann Poyrazoğlu

    22. Apr. 15 um 11:44

  • testest du auf einem realen gerät? außerdem sagt die Dokumentation: Wenn der Client nicht verbunden ist, wird null zurückgegeben. Stellen Sie sicher, dass Ihr Client überhaupt verbunden ist.

    – Amit K. Saha

    22. Apr. 15 um 11:48

  • Könnten Sie den Code dort einfügen, wo Sie den API-Client initialisieren und wo Sie null erhalten?

    – Borja Alvarez

    22. Apr. 15 um 11:48

  • Diese Antwort ist genau der gleiche Mist, der überall in diesem Beitrag steht. Die Frage bezieht sich nicht auf Standortrückrufe, die Frage bezieht sich auf FusedLocationProvider, der null für getLastLocation zurückgibt. Ich für meinen Teil sehe es null sagen, dann richtig melden und Sekunden später wieder null melden, nur auf einigen Geräten.

    – Saik Caskey

    20. Juni ’17 um 12:52


Warum ist FusedLocationApigetLastLocation null
Amit K. Saha

Der Anbieter des fusionierten Standorts verwaltet den Standort im Hintergrund nur, wenn mindestens ein Client damit verbunden ist. Wenn Sie jetzt nur noch den Standortdienst aktivieren, wird die Speicherung des letzten bekannten Standorts nicht garantiert.

Sobald der erste Client eine Verbindung herstellt, 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 die Zeit möglicherweise nicht aus, um den ersten Standort zu erreichen.

Dann stellst du ein mLocationRequest.setFastestInterval(30000); was im Grunde 30 Sekunden bedeutet. Also mindestens 30 Sekunden nach und im Allgemeinen ist die bevorzugte Zeit gemäß Ihrer Einstellung 120 Sekunden, ist es nicht eine sehr lange Zeit, wenn überhaupt kein letzter bekannter Standort gespeichert ist? Außerdem stellen Sie die Priorität für den Batterieausgleich ein, wodurch Sie länger warten müssen.

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

Ich schlage vor, dass Sie zuerst die Maps-App starten, damit zumindest ein bestätigter Standort vorhanden ist, und dann Ihre App testen.

  • Ich hatte das gleiche Problem wie OP, aber während der Verwendung des Emulators, nachdem ich den Standort des Geräts manuell festgelegt hatte. Das Öffnen von Maps im Emulator hat dies für mich behoben.

    – Daniel O

    15. November ’19 um 19:21

1641748369 470 Warum ist FusedLocationApigetLastLocation null
Ravi Bhandari

Ich verwende die FusedLocationProvider-API in meiner App. Hier ist mein Code, der sowohl auf dem Gerät als auch auf dem Emulator funktioniert –

  @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 Arbeitscode von mir.

Hoffe mein Code hilft dir.

Beifall..

  • Beachten Sie, dass Sie GoogleApiClient.ConnectionCallbacks und com.google.android.gms.location.LocationListener implementieren müssen

    – DJ_Polly

    21. Juni ’15 um 5:18

  • Was ist also der Hauptunterschied zum Code des Autors? Befehlsfolge?

    – Alexey Strakh

    30. Juli ’16 um 6:44


  • @ AlexeyStrakh Ja. Beim Start der App war das lastLocation-Objekt von googleApiClient null. Folglich wird beim Aufrufen des letzten Standorts für ein Null-Objekt null zurückgegeben. Daher sollte der Algorithmus verbessert werden, indem zuerst der Standort aktualisiert wird. Wenn googleApiClient dann den aktuellen Standort erfasst hat, fragen Sie ihn danach. Seien Sie vorsichtig, denn wenn sich der Standort nicht ändert, wird der onLocationChanged nicht ausgelöst.

    – Haikal Nashuha

    28. Okt ’16 um 13:56

  • Sie verwenden nicht einmal fusedLocationProviderApi … die Frage ist “Warum ist FusedLocationApi.getLastLocation null” und nicht “Wie kann ich Standortaktualisierungen ohne FusedLocationApil durchführen?”

    – Saik Caskey

    20. Juni ’17 um 12:44


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

Für mich bestand eine Lösung des Problems darin, Folgendes anzurufen:

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

Vor dem:

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

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

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.

  • Dies ist richtig, ich hatte vor einiger Zeit ein ähnliches Problem. stackoverflow.com/q/35830987/4243687 Die lastKnownLoction ist einfach ein zwischengespeicherter Ort. Wenn andere Apps einen Standort anfordern, wird dieser Standort tatsächlich zwischengespeichert

    – Ersen Osman

    17. Februar ’17 um 16:47


1641748369 571 Warum ist FusedLocationApigetLastLocation null
Ketan Ramani

Ich habe FusedAPI verwendet und der folgende Code funktioniert für mich … Test in Real device

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

Helferklasse

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

Kann helfen

Wahrscheinlich ist Ihr Problem, wo Sie den Client verbinden, ich kann jetzt nicht testen, aber wie Google Doc im Beispiel zeigt, sollten Sie den Client in Ihrem verbinden onStart() Methode in der Aktivität.

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

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

Für mich funktioniert dadurch getLocation

  • Sie sollten den Google-API-Client trennen, bevor Sie die Super-Methode in OnStop() Ihrer Activity-Klasse aufrufen.

    – Mrigank

    14. Januar ’16 um 3:15

1641748369 505 Warum ist FusedLocationApigetLastLocation null
Axt

Mit Android APILEVEL über 23 benötigen Sie einige Laufzeitberechtigungen. Standortdienst ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION sind auch Berechtigungen erforderlich.

Sehen Sie sich diese Dokumentation an https://developer.android.com/training/permissions/requesting.html

  • Sie sollten den Google-API-Client trennen, bevor Sie die Super-Methode in OnStop() Ihrer Activity-Klasse aufrufen.

    – Mrigank

    14. Januar ’16 um 3:15

1641748369 402 Warum ist FusedLocationApigetLastLocation null
Rishabh

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

Versuchen Sie, die App von Ihrem Gerät zu deinstallieren und dann erneut bereitzustellen. Es wird erneut um Erlaubnis gebeten. Erlauben Sie einen feinen Standortzugriff.

Hat in meinem Fall funktioniert !!

.

227980cookie-checkWarum ist FusedLocationApi.getLastLocation null?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy