Wie überprüfe ich, ob Ortungsdienste aktiviert sind?
Lesezeit: 8 Minuten
Meroelyth
Ich entwickle eine App auf Android OS. Ich weiß nicht, wie ich überprüfen kann, ob die Ortungsdienste aktiviert sind oder nicht.
Ich brauche eine Methode, die “true” zurückgibt, wenn sie aktiviert sind, und “false”, wenn nicht (also kann ich im letzten Fall einen Dialog anzeigen, um sie zu aktivieren).
Vielen Dank für den Code. Suche nach Standortmanager: lm.getAllProviders().contains(LocationManager.GPS_PROVIDER) (oder NETWORK_PROVIDER) würde sicherstellen, dass Sie den Benutzer nicht auf eine Einstellungsseite werfen, auf der es keine Netzwerkoption gibt.
– Peter
16. November 2013 um 16:32 Uhr
Ebenfalls: Settings.ACTION_SECURITY_SETTINGS sollte sein Settings.ACTION_LOCATION_SOURCE_SETTINGS
– Peter
16. November 2013 um 17:12 Uhr
Sie könnten überprüfen, ob sich das Telefon im Flugzeugmodus befindet, und damit umgehen …. stackoverflow.com/questions/4319212/…
– John
15. April 2015 um 19:29 Uhr
Ich hatte einige Probleme mit lm.isProviderEnabled(LocationManager.GPS_PROVIDER), das früher immer falsch zurückgab. Dies scheint aufzutreten, wenn Sie die neue Version von Play Services verwenden: die, die einen Dialog anzeigt, in dem Sie Ihr GPS direkt aus dem Dialog heraus einschalten können, ohne die Aktivität der Einstellungen anzuzeigen. Wenn der Benutzer GPS aus diesem Dialog ausschaltet, gibt diese Anweisung immer falsch zurück, auch wenn GPS eingeschaltet ist
– Marcelo Noguti
18. September 2015 um 14:21 Uhr
Außerdem sollten keine leeren, verwirrenden, nutzlosen Try-Catch-Blöcke gesetzt werden
Aus Gründen der Übersichtlichkeit sollten Sie im catch-Block möglicherweise false zurückgeben. Andernfalls initialisieren Sie locationMode auf Settings.Secure.LOCATION_MODE_OFF.
– RyanLeonard
27. Oktober 2014 um 23:44 Uhr
Dies ist eine gute Antwort, da sie sowohl mit den alten als auch mit den neuen Android-Standort-APIs funktioniert.
– Diederich
10. Juni 2015 um 10:25 Uhr
LOCATION_PROVIDERS_ALLOWED – Verknüpfung Diese Konstante war in API-Level 19 veraltet. Wir müssen LOCATION_MODE und MODE_CHANGED_ACTION (oder PROVIDERS_CHANGED_ACTION) verwenden.
– Choletski
3. August 2015 um 12:49 Uhr
Diese Antwort hätte als die richtige Antwort akzeptiert werden müssen. Die Methode locationManager.isProviderEnabled() ist auf meinem 4.4-Gerät nicht zuverlässig (und wie ich gesehen habe, hatten andere Entwickler das gleiche Problem auch auf anderen Betriebssystemversionen). In meinem Fall gibt es in jedem Fall true für GPS zurück (es spielt keine Rolle, ob Ortungsdienste aktiviert sind oder nicht). Danke für diese tolle Lösung!
– Starker Mayer
11. August 2015 um 22:49 Uhr
Dies funktionierte nicht auf meinem Testgerät, Samsung SHV-E160K, Android 4.1.2, API 16. Obwohl ich das GPS offline mache, gibt diese Funktion immer noch true zurück. Ich habe auf Android Nougat getestet, API 7.1 funktioniert
– HendraWD
23. November 2016 um 9:11 Uhr
Mayank Sharma
Wie jetzt im Jahr 2020
Der neueste, beste und kürzeste Weg ist
@SuppressWarnings("deprecation")
public static Boolean isLocationEnabled(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// This is a new method provided in API 28
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return lm.isLocationEnabled();
} else {
// This was deprecated in API 28
int mode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
Settings.Secure.LOCATION_MODE_OFF);
return (mode != Settings.Secure.LOCATION_MODE_OFF);
}
}
Exzellent ! Aber noch besser, das Casting loswerden und direkt bestehen LocationManager.class in getSystemService Methode, weil der Aufruf API 23 erfordert 😉
Dieser Code funktioniert für meinen Anwendungsfall, aber ich kann keine Änderungen hören. Wenn der Modus „Nur Gerät“ ist und der Benutzer die Ortungsdienste deaktiviert. Empfänger wird nicht für MODE_CHANGED_ACTION ausgelöst. Aber für alle anderen Moduswechsel wird es ausgelöst.
private fun isLocationEnabled(context: Context): Boolean {
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
return LocationManagerCompat.isLocationEnabled(locationManager)
}
Lenik
Sie können diesen Code verwenden, um Benutzer zu den Einstellungen zu leiten, wo sie GPS aktivieren können:
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if( !locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ) {
new AlertDialog.Builder(context)
.setTitle(R.string.gps_not_found_title) // GPS not found
.setMessage(R.string.gps_not_found_message) // Want to enable?
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
owner.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton(R.string.no, null)
.show();
}
Vielen Dank, aber ich brauche den Code nicht, um GPS zu überprüfen, sondern nur Ortungsdienste.
– Meroelyth
25. April 2012 um 8:19 Uhr
Ortungsdienste sind immer verfügbar, aber die verschiedenen Anbieter sind möglicherweise nicht verfügbar.
– Lenik
25. April 2012 um 8:22 Uhr
@lenik, einige Geräte bieten eine Einstellung (unter “Einstellungen > Persönlich > Ortungsdienste > Zugriff auf meinen Standort”), die die Standorterkennung insgesamt zu aktivieren / deaktivieren scheint, auch wenn bestimmte Anbieter aktiviert sind. Ich habe das aus erster Hand mit einem Telefon gesehen, mit dem ich getestet habe, und obwohl sowohl WLAN als auch GPS aktiviert waren, schienen sie tot zu sein … für meine App. Leider habe ich die Einstellung seitdem aktiviert und kann das ursprüngliche Szenario nicht mehr reproduzieren, selbst wenn ich die Einstellung „Zugriff auf meinen Standort“ deaktiviert habe. Ich kann also nicht sagen, ob sich diese Einstellung auf die auswirkt isProviderEnabled() und getProviders(true) Methoden.
– Der Awnry-Bär
13. März 2014 um 9:06 Uhr
… Ich wollte das nur rauswerfen, falls jemand anderes auf das gleiche Problem stößt. Ich hatte die Einstellung noch nie zuvor auf anderen Geräten gesehen, mit denen ich getestet habe. Es scheint eine Art systemweiter Standorterkennungs-Kill-Switch zu sein. Falls jemand Erfahrung damit hat, wie das isProviderEnabled() und getProviders(true) Methoden reagieren, wenn eine solche Einstellung aktiviert ist (oder deaktiviert ist, je nachdem, wie Sie es betrachten), wäre ich sehr neugierig zu wissen, was Sie erlebt haben.
– Der Awnry-Bär
13. März 2014 um 9:10 Uhr
ZaBlanc
Ausgehend von der obigen Antwort müssen Sie in API 23 “gefährliche” Berechtigungsprüfungen hinzufügen und das System selbst überprüfen:
Vielen Dank, aber ich brauche den Code nicht, um GPS zu überprüfen, sondern nur Ortungsdienste.
– Meroelyth
25. April 2012 um 8:19 Uhr
Ortungsdienste sind immer verfügbar, aber die verschiedenen Anbieter sind möglicherweise nicht verfügbar.
– Lenik
25. April 2012 um 8:22 Uhr
@lenik, einige Geräte bieten eine Einstellung (unter “Einstellungen > Persönlich > Ortungsdienste > Zugriff auf meinen Standort”), die die Standorterkennung insgesamt zu aktivieren / deaktivieren scheint, auch wenn bestimmte Anbieter aktiviert sind. Ich habe das aus erster Hand mit einem Telefon gesehen, mit dem ich getestet habe, und obwohl sowohl WLAN als auch GPS aktiviert waren, schienen sie tot zu sein … für meine App. Leider habe ich die Einstellung seitdem aktiviert und kann das ursprüngliche Szenario nicht mehr reproduzieren, selbst wenn ich die Einstellung „Zugriff auf meinen Standort“ deaktiviert habe. Ich kann also nicht sagen, ob sich diese Einstellung auf die auswirkt isProviderEnabled() und getProviders(true) Methoden.
– Der Awnry-Bär
13. März 2014 um 9:06 Uhr
… Ich wollte das nur rauswerfen, falls jemand anderes auf das gleiche Problem stößt. Ich hatte die Einstellung noch nie zuvor auf anderen Geräten gesehen, mit denen ich getestet habe. Es scheint eine Art systemweiter Standorterkennungs-Kill-Switch zu sein. Falls jemand Erfahrung damit hat, wie das isProviderEnabled() und getProviders(true) Methoden reagieren, wenn eine solche Einstellung aktiviert ist (oder deaktiviert ist, je nachdem, wie Sie es betrachten), wäre ich sehr neugierig zu wissen, was Sie erlebt haben.
Ich weiß, dass dies ein altes Thema ist, aber für diejenigen, die folgen mögen … Google hat dafür eine API veröffentlicht; sehen developer.google.com/android/reference/com/google/android/gms/…
– Peter McLennan
15. August 2015 um 3:02 Uhr
Ich habe eine ähnliche Frage hier mit Codes beantwortet. Hör zu. Sehr hilfreich.
– S. bruce
2. März 2016 um 19:16 Uhr
FYI: SettingsApi ist jetzt veraltet. Verwenden developer.google.com/android/reference/com/google/android/gms/… stattdessen.
– Rajiv
19. Mai 2020 um 6:49 Uhr