LocationClient getLastLocation () gibt null zurück
Wie die Fragen, die jemand begegnet, bevor
Getestet habe ich ein nexus s(4.0.4 mit google-play-Dienst zur Verfügung) und avd (4.2.2 mit google api), in beiden Fällen locationclient ist getLastLocation()
immer wieder null
.
public class MainActivity extends Activity implements LocationListener,
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {
private LocationClient mLocationClient;
private LocationRequest mLocationRequest;
boolean mUpdatesRequested = false;
boolean mConnected = false;
SharedPreferences mPrefs;
SharedPreferences.Editor mEditor;
private TextView mText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText = (TextView) findViewById(R.id.text);
mLocationRequest = LocationRequest.create();
mLocationRequest
.setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest
.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);
mUpdatesRequested = false;
mPrefs = getSharedPreferences(LocationUtils.SHARED_PREFERENCES,
Context.MODE_PRIVATE);
mEditor = mPrefs.edit();
mLocationClient = new LocationClient(this, this, this);
}
@Override
public void onStart() {
super.onStart();
/*
* Connect the client. Don't re-start any requests here; instead, wait
* for onResume()
*/
mLocationClient.connect();
}
@Override
protected void onResume() {
super.onResume();
//If the app already has a setting for getting location updates, get it
if (mPrefs.contains(LocationUtils.KEY_UPDATES_REQUESTED)) {
mUpdatesRequested = mPrefs.getBoolean(
LocationUtils.KEY_UPDATES_REQUESTED, false);
//Otherwise, turn off location updates until requested
} else {
mEditor.putBoolean(LocationUtils.KEY_UPDATES_REQUESTED, false);
mEditor.commit();
}
}
@Override
public void onStop() {
//If the client is connected
if (mLocationClient.isConnected()) {
stopPeriodicUpdates();
}
//After disconnect() is called, the client is considered "dead".
mLocationClient.disconnect();
super.onStop();
}
@Override
public void onPause() {
//Save the current setting for updates
mEditor.putBoolean(LocationUtils.KEY_UPDATES_REQUESTED,
mUpdatesRequested);
mEditor.commit();
super.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void getLocation(View v) {
//If Google Play Services is available
if (isGooglePlayServicesAvailable()) {
if (!mConnected)
mText.setText("location client is not connected to service yet");
else {
//Get the current location
Location currentLocation = mLocationClient.getLastLocation();
//Display the current location in the UI
mText.setText(LocationUtils.getLocationString(currentLocation));
}
}
}
private boolean isGooglePlayServicesAvailable() {
//Check that Google Play services is available
int resultCode = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(this);
//If Google Play services is available
if (ConnectionResult.SUCCESS == resultCode) {
//In debug mode, log the status
Log.d(LocationUtils.APPTAG, "google play service is available");
//Continue
return true;
//Google Play services was not available for some reason
} else {
//Display an error dialog
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode,
this, 0);
if (dialog != null) {
Log.e(LocationUtils.APPTAG,
"google play service is unavailable");
}
return false;
}
}
private void stopPeriodicUpdates() {
mLocationClient.removeLocationUpdates(this);
//mConnectionState.setText(R.string.location_updates_stopped);
}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
mConnected = false;
Log.d(LocationUtils.APPTAG, "connection failed");
}
@Override
public void onConnected(Bundle arg0) {
mConnected = true;
Log.d(LocationUtils.APPTAG,
"location client connected to the location server");
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0,
new android.location.LocationListener() {
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onLocationChanged(final Location location) {
}
});
Log.d(LocationUtils.APPTAG, "done trying to get location");
}
@Override
public void onDisconnected() {
//TODO Auto-generated method stub
mConnected = false;
Log.d(LocationUtils.APPTAG,
"location client disconnected from the location server");
}
@Override
public void onLocationChanged(Location arg0) {}
}
meisten von Ihnen kamen aus Beispiele gegeben von google. In den obigen code hava versucht, die Methode so:
LocationRequest request = LocationRequest.create();
request.setNumUpdates(1);
mLocationClient.requestLocationUpdates(request, this);
und
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0,
new android.location.LocationListener() {
@Override
public void onStatusChanged(String provider, int status,Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onLocationChanged(final Location location) {}
});
In onConnected()
vor dem Aufruf getLastLocation()
aber immer noch kein Glück.
Wo ist der Fehler, vielen Dank im Voraus.
InformationsquelleAutor der Frage oscarthecat | 2013-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit die
Fused Location Provider
wird nur halten, hintergrund Ort, wenn mindestens ein client verbunden ist. Sobald der erste client eine Verbindung herstellt, wird er sofort versuchen Sie, einen Speicherort. Wenn Ihre Aktivität wird der erste client die Verbindung und rufen SiegetLastLocation()
sofort inonConnected()
dass vielleicht nicht genug Zeit für die erste Position zu kommen.InformationsquelleAutor der Antwort David
Ich hatte das gleiche problem, wenn Sie die folgenden Anweisungen aus das tutorial.
Am Telefon klappte es und auf den (Genymotion) emulator ist es nicht.
Lösung
In Ihrem AndroidManifest.xml ändern Sie diese:
:
...und Sie bekommen die Position sofort. Keine Notwendigkeit, den code ändern (zu hören auf Standort-updates).
InformationsquelleAutor der Antwort Saran
Das Problem kann auch verursacht werden von Ihrem Gerät nicht über "Wi-Fi & Mobilfunknetz" aktiviert.
LocationClient (fused location provider) nutzt sowohl GPS und WiFi. GPS dauert eine Weile, um Ihren Standort zu finden, während wifi ist viel schneller. Jedoch, wenn eine dieser 2 Dienstleistungen verbunden ist, die call back Methode onConnected aufgerufen werden. Und wenn Sie versuchen, rufen Sie LocationClient.getLastLocation() in der Methode onConnected sofort, ist es meistens wahrscheinlich, dass Sie null Wert wenn Ihr WLAN-Standort service deaktiviert ist. Es ist nur, weil GPS ist einfach nicht schnell genug.
Um das problem zu lösen, für sich selbst lokal, aktivieren Sie "Wi-Fi & mobile network location". Sie können es tun, indem Sie zu "Einstellungen > Personal > Lage, Zugang > Wi-Fi & mobile network location".
Jedoch, wenn Sie wollen, um das Problem zu lösen für die Benutzer Ihrer app, die Sie besser überprüfen Sie, ob getLastLocation() null zurück. Wenn Sie es tut, wird die Eingabeaufforderung für den Benutzer aktivieren Sie den Dienst wie google-map wird.
Hoffentlich, dass das hilft.
InformationsquelleAutor der Antwort Tim Hong
Ich Stand vor einem ähnlichen Problem.
Call
mLocationClient.getLastLocation()
imonConnected
oder nachdem die Verbindung zum Google-Play-Dienste eingerichtet wurde. Wenn Sie Sie diese Methode aufrufen, bevor Sie den Speicherort Client angeschlossen ist, wird die Position zurückgegeben, wärenull
.Könnte man prüfen, ob die Lage-client verbunden ist
mLocationClient.isConnected()
.Hoffe, das hilft.
InformationsquelleAutor der Antwort Rahul Sainani
Müssen Sie prüfen, ob Benutzer aktiviert hat Lage über Wi-Fi/GSM oder GPS. Wenn es keine verfügbaren location-Anbieter, erhalten Sie
null
.Dieser code zeigt den Bildschirm, mit Standort-Einstellungen:
InformationsquelleAutor der Antwort Pitel
Ich vor ähnlichen Fragen auf meine tests mit Samsung-Handys (stark angepassten android, und keinen Entwickler-support).
LocationManager und LocationClient nicht bekommen, das GPS vom Anbieter. Sie brauchen, um zu werden, wurde immer müssen Sie den Speicherort von Ihnen. Tun Sie dies, bevor Sie Ihre
LocationManager.getLastKnownLocation
ODERLocationClient.getLastLocation
Anrufe. Diese API zurück.InformationsquelleAutor der Antwort Siddharth
Dies ist genau die Arbeit die Lösung, wahrscheinlich zu einem etwas anderen Umständen. Aber ich wollte fügen Sie einige kleine Erklärung, die Schritte so, dass irgendjemand die genauen Konzepte:
1) onCreate() der Android-Komponente (Z.B. AktivitätFragment oder Service. Hinweis: Nicht IntentService), bauen und dann verbinden die GoogleApiClient als unten.
wo buildGoogleApiClient () - Implementierung ist,
Später onDestroy(), können Sie trennen GoogleApiClient als,
Schritt 1 stellt sicher, dass Sie bauen und verbinden die GoogleApiClient.
1) GoogleApiClient Instanz erste mal verbunden wird, auf Methode onConnected(). Nun, der nächste Schritt Aussehen sollte onConnected () - Methode.
Oben, Sie heißt die Methode createLocationRequest() zu erstellen Lage-Anfrage. Die Methode createLocationRequest() sieht wie folgt aus.
3) Nun auf onLocationChange() callback der LocationListener-Schnittstelle, Sie bekommen einen neuen Standort.
Sie das Ergebnis zu erhalten, wie dies in Logcat:
03-22 18:34:17.336 817-817/com.LiveEarthquakesAlerts ich/LocationTracker: Lage: Lage[verschmolzen 37.421998,-122.084000 acc=20 et=+15m35s840ms alt=0.0]
In der Lage sein, das zu tun diese drei Schritte sollten Sie so konfiguriert haben, dass Ihr bauen.gradle als unten:
InformationsquelleAutor der Antwort Uddhav Gautam
Auf SDK-Versionen 23
Müssen Sie auch explizit angefordert werden, der Standort während der Laufzeitals pro
https://developer.android.com/training/permissions/requesting.html
genauso wie es in der manifest-Datei.
Kein expliziter Fehler wird auftreten, wenn Sie nicht die Berechtigungen, die während der Laufzeit der location-Anbieter wird einfach null zurückgegeben.
Würde es helfen, wenn Google dokumentiert dies, und auch eine exception werfen, statt einfach null zurückgeben. Null zurückgeben ist über die am wenigsten hilfreich, was in dieser situation zu tun.
InformationsquelleAutor der Antwort Mark
War ich auch vor dem gleichen Problem auf meiner app, und die einzige fehlende Sache war, dass die app nur dann angefordert, für ACCESS_COARSE_LOCATION und nicht ACCESS_FINE_LOCATION.
Ich fügte hinzu, die später die Erlaubnis, und alles funktionierte OK.
InformationsquelleAutor der Antwort gfhuertac
Google-play-Dienst geolocation kann nicht arbeiten ohne internet-Verbindung, gleichgültig für GPS. Also, bitte überprüfen Sie die app mit mobile Daten eingeschaltet.
InformationsquelleAutor der Antwort user1575120
Sie brauchen nur eine update-Anfrage für den Standort. Wenn mit 26 Android SDK permitions ist alles ok:
und in der onConnected callback-Methode:
InformationsquelleAutor der Antwort CodeToLife
Ich laufen und seine arbeiten perfekt in der Nexus-7-Gerät.
Sie Jungs versehentlich geschrieben, alte version LocationListener verwendet wird und nicht mit der neuen API.
Müssen Sie mit new LocationListener.
Müssen Sie zum importieren dieser Klasse und dann versuchen.
Und überschreiben die einzige Methode wie pro neue API
Bitte versuchen Sie diesen Weg und lassen Sie mich wissen, wenn Sie noch vor einem Problem.
Dank.
InformationsquelleAutor der Antwort PrashantAdesara
Am einfachsten zu beheben, wenn auch verlangsamt ein wenig, ist die Verwendung einer Hilfsfunktion. Mein problem war, dass es verbinden würde, aber bevor es war ein Ort gefunden, würde ich versuchen, darauf zuzugreifen und prallte gegen einen null-Zeiger.
Verwenden Sie einfach diese in
onConnected
und festlegen, was Sie wollte, die Lage zu sein, diese Funktion zu verwenden, eine Weitergabe Ihrer Standort-client.Auch wenn Sie nicht wollen, um den Speicherort von
onConnected
aus welchem Grund auch immer, können Sie verwenden die gleiche Hilfsfunktion, die überall, solange Sie Ihren passlocationClient
.InformationsquelleAutor der Antwort nvcballer15