2017-04-04 3 views
0

Ich habe ein Problem mit Android. Auch nachdem der Benutzer seinen Standortdienst eingeschaltet hat, kann der LocationManager den Standort des Benutzers immer noch nicht finden.LocationManager kann den letzten bekannten Standort nach dem Einschalten von GPS immer noch nicht finden

Bevor ich starten Sie die Tätigkeit, die den Standort des Nutzers verwenden, muss ich anrufen folgendes:

//Menu Activity 
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
if(lm.isProviderEnabled(LocationManager.GPS_PROVIDER){ 
    Intent nearby = new Intent(mActivityContext, NearbyActivity.class); 
    startActivity(nearby); 
}else{ 
    alertNoGps(); 
} 

Sobald GPS auf dem nahe gelegenen Aktivität eingeschaltet wird, kann gestartet werden, aber die Locationmanager kann immer noch nicht die Nutzer finden, letzte bekannte Lage. Mein relevanter Code dafür ist:

//Nearby Activity 
try{ 
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    if(location != null){ 
     ... 
    }else{ 
     Toast.makeText ... 
    } 
} catch(SecurityException e){ 
    e.printStackTrace(); 
} 

Das Telefon, auf dem ich gerade teste, läuft Android Marshmallow 6.0.1. Wenn das GPS bereits eingeschaltet ist, bevor die App durch Android Studio läuft, habe ich kein Problem den letzten bekannten Ort zu bekommen. Nur wenn das GPS ausgeschaltet ist, bevor ich die App starte und einschalte, während die App läuft, habe ich Probleme. Was ist mit LocationManger verursacht dies?

Edit: Auch im Manifest habe ich sowohl Fein- als auch Grobstandortberechtigungen. Ich weiß nicht, ob dies ein Problem mit API 23 und höher ist, wegen der zusätzlichen erforderlichen Berechtigungsprüfungen, aber ich muss mir vorstellen, dass sie weiterhin von der Sicherheitsausnahme behandelt werden.

Antwort

0

Es gibt zwei verschiedene Möglichkeiten, den Standort abzurufen. Einer basiert auf dem Netzwerk und ein anderer basiert auf GPS-Diensten. Sicherlich wäre der GPS-basierte Standort immer genauer. Gemäß der Dokumentation kann es einige Zeit dauern, bis der Standort mit den GPS-Diensten empfangen wird. In diesem Fall kann der letzte bekannte Speicherort verwendet werden, um den zuletzt verfügbaren Speicherort mithilfe der getLastKnownLocation() -Methode abzurufen. Um den letzten verfügbaren Speicherort zu erhalten, sollten Sie LocationManager.GPS_PROVIDER in LocationManager.NETWORK_PROVIDER ändern.

Und wenn Sie den genauen Standort in Echtzeit basierend auf GPS-Diensten erhalten möchten, empfehle ich Ihnen, FusedLocationApi zu verwenden. Sie können es hier finden https://developer.android.com/training/location/receive-location-updates.html

Prost .. !!

0

Genau so sollte es funktionieren. Android löscht den letzten bekannten Standort für einen Anbieter, wenn dieser deaktiviert ist, und gibt null zurück, bis ein neuer Punkt für diesen Anbieter abgerufen wird.

In Ihrer Situation würde ich empfehlen, wenn Sie Null Standort für den letzten bekannten Standort mit GPS erhalten, nur für ein einzelnes Update anfordern.

0

Ich fand heraus, dass getLastKnownLocation() ähnlich wie Pablos Antwort gelöscht wird und weil es eine eher zufällige Funktion ist, kann Null oft zurückgeben. Wenn GPS-Koordinaten mehr gefragt sind, sollten Sie stärker sein, wenn Sie versuchen, GPS-Koordinaten zu erhalten und etwas wie requestLocationUpdates() oder Googles FusedLocationApi anstelle von getLastKnownLocation() verwenden.

So, jetzt verwende ich FusedLocationApi mit einem GoogleApiClient ich mit gebaut:

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

Nachdem der Client verbunden ist finde ich die GPS-Position in der onConnected() -Methode überschreiben, die wie folgt aussieht:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
Location location = LocationServices.FusedLocationApi.getLastLocation(client); 

Dies scheint viel zuverlässiger bei der Suche nach GPS-Koordinaten zu sein.

Verwandte Themen