Wie überprüfe ich, ob Ortungsdienste aktiviert sind?


228

Ich entwickle eine App für Android OS. Ich kann nicht überprüfen, ob die Ortungsdienste aktiviert sind oder nicht.

Ich benötige eine Methode, die "true" zurückgibt, wenn sie aktiviert sind, und "false", wenn nicht (daher kann ich im letzten Fall einen Dialog anzeigen, um sie zu aktivieren).


3
Ich weiß, dass dies ein altes Thema ist, aber für diejenigen, die vielleicht folgen ... Google hat eine API dafür veröffentlicht; Siehe Entwickler.google.com/android/reference/com/google/android/gms/…
Peter McLennan


Zu Ihrer Information: SettingsApi ist jetzt veraltet. Verwenden Sie stattdessen developer.google.com/android/reference/com/google/android/gms/… .
Rajiv

Antworten:


361

Mit dem folgenden Code können Sie überprüfen, ob GPS-Anbieter und Netzwerkanbieter aktiviert sind oder nicht.

LocationManager lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
boolean gps_enabled = false;
boolean network_enabled = false;

try {
    gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {}

try {
    network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {}

if(!gps_enabled && !network_enabled) {
    // notify user
    new AlertDialog.Builder(context)
        .setMessage(R.string.gps_network_not_enabled)
        .setPositiveButton(R.string.open_location_settings, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
            }
        }
        .setNegativeButton(R.string.Cancel,null)
        .show();    
}

In der Manifestdatei müssen Sie die folgenden Berechtigungen hinzufügen

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

Danke für den Code. Nach Standortmanager suchen: 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.
Petter

26
Auch: Settings.ACTION_SECURITY_SETTINGSsollteSettings.ACTION_LOCATION_SOURCE_SETTINGS
petter

2
Sie könnten überprüfen, ob sich das Telefon im Flugzeugmodus befindet, und damit umgehen .... stackoverflow.com/questions/4319212/…
John

2
Ich hatte einige Probleme mit lm.isProviderEnabled (LocationManager.GPS_PROVIDER), die immer false zurückgaben. 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 Einstellungsaktivität anzuzeigen. Wenn der Benutzer GPS aus diesem Dialogfeld schaltet, gibt diese Anweisung immer false zurück, auch wenn GPS
aktiviert

7
sollte auch keine leeren, verwirrenden, nutzlosen Try-Catch-Blöcke setzen
Chisko

225

Ich benutze diesen Code zur Überprüfung:

public static boolean isLocationEnabled(Context context) {
    int locationMode = 0;
    String locationProviders;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);

        } catch (SettingNotFoundException e) {
            e.printStackTrace();
            return false;
        }

        return locationMode != Settings.Secure.LOCATION_MODE_OFF;

    }else{
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        return !TextUtils.isEmpty(locationProviders);
    }


} 

7
Aus Gründen der Übersichtlichkeit möchten Sie möglicherweise false im catch-Block zurückgeben. Andernfalls initialisieren Sie locationMode auf Settings.Secure.LOCATION_MODE_OFF.
RyanLeonard

2
Dies ist eine gute Antwort, da sie sowohl mit der alten als auch mit der neuen Android-Standort-API funktioniert.
Diederik

2
LOCATION_PROVIDERS_ALLOWED - link Diese Konstante war in API-Level 19 veraltet. Wir müssen LOCATION_MODE und MODE_CHANGED_ACTION (oder PROVIDERS_CHANGED_ACTION) verwenden
Choletski

3
Diese Antwort sollte als die richtige Antwort akzeptiert worden sein. Die locationManager.isProviderEnabled () -Methode ist auf meinem 4.4-Gerät nicht zuverlässig (und wie ich sah, hatten andere Entwickler das gleiche Problem auch auf anderen Betriebssystemversionen). In meinem Fall wird für GPS jeweils true zurückgegeben (es spielt keine Rolle, ob Ortungsdienste aktiviert sind oder nicht). Vielen Dank für diese großartige Lösung!
Strongmayer

2
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, API 7.1 getestet, es funktioniert
HendraWD

36

Wie jetzt im Jahr 2020

Neuester, bester und kürzester Weg ist

public static Boolean isLocationEnabled(Context context)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// This is new method provided in API 28
            LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            return lm.isLocationEnabled();
        } else {
// This is 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);

        }
    }

1
Ausgezeichnet ! Aber noch besser, loszuwerden Gießen und direkt passiert LocationManager.classin getSystemServiceVerfahren wegen Aufruf API erfordert 23 ;-)
Mackovich

6
Oder Sie können stattdessen LocationManagerCompat verwenden. :)
Mokkun

Verwenden Sie return lm! = Null && lm.isLocationEnabled (); anstelle von return lm.isLocationEnabled ();
Dr. DS

35

Mit diesem Code können Sie Benutzer zu Einstellungen weiterleiten, in denen 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();
    }

1
Vielen Dank, aber ich brauche den Code nicht, um GPS zu überprüfen, sondern nur Ortungsdienste.
Meroelyth

1
Ortungsdienste sind immer verfügbar, die verschiedenen Anbieter sind jedoch möglicherweise nicht verfügbar.
Lenik

4
@lenik, einige Geräte bieten eine Einstellung (unter "Einstellungen> Persönlich> Standortdienste> Zugriff auf meinen Standort"), die die Standorterkennung insgesamt zu aktivieren / deaktivieren scheint, selbst wenn bestimmte Anbieter aktiviert sind. Ich habe dies aus erster Hand mit einem Telefon gesehen, mit dem ich getestet habe, und obwohl sowohl Wifi als auch GPS aktiviert waren, schienen sie für meine App tot zu sein. Leider habe ich die Einstellung seitdem aktiviert und kann das ursprüngliche Szenario nicht mehr reproduzieren, selbst wenn diese Einstellung "Zugriff auf meinen Standort" deaktiviert ist. Ich kann also nicht sagen, ob diese Einstellung die Methoden isProviderEnabled()und beeinflusst getProviders(true).
Der Awnry Bär

... Ich wollte das nur rauswerfen, falls jemand anderes auf dasselbe Problem stößt. Ich hatte die Einstellung noch nie auf anderen Geräten gesehen, mit denen ich getestet habe. Es scheint sich um eine Art systemweiten Kill-Switch zur Standorterkennung zu handeln. Wenn jemand Erfahrung damit hat, wie die Methoden isProviderEnabled()und getProviders(true)Methoden reagieren, wenn eine solche Einstellung aktiviert (oder deaktiviert, je nachdem, wie Sie sie betrachten), wäre ich sehr gespannt, auf was Sie gestoßen sind.
Der Awnry Bär

25

Migrieren Sie zu Android X und verwenden Sie

implementation 'androidx.appcompat:appcompat:1.1.0'

und verwenden Sie LocationManagerCompat

In Java

private boolean isLocationEnabled(Context context) {
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    return LocationManagerCompat.isLocationEnabled(locationManager);
}

In Kotlin

private fun isLocationEnabled(context: Context): Boolean {
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    return LocationManagerCompat.isLocationEnabled(locationManager)
}

Dies funktioniert für alle Android-Versionen seit Android 1.0. Hinweis: Before API version LOLLIPOP [API Level 21], this method would throw SecurityException if the location permissions were not sufficient to use the specified provider.Wenn Sie keine Berechtigung für das Netzwerk oder den GPS-Anbieter haben, wird möglicherweise eine Ausnahme ausgelöst, je nachdem, welche aktiviert ist. Überprüfen Sie den Quellcode für weitere Informationen.
Xuiqzy

15

Wenn Sie die obige Antwort abarbeiten, müssen Sie in API 23 "gefährliche" Berechtigungsprüfungen sowie die Überprüfung des Systems selbst hinzufügen:

public static boolean isLocationServicesAvailable(Context context) {
    int locationMode = 0;
    String locationProviders;
    boolean isAvailable = false;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }

        isAvailable = (locationMode != Settings.Secure.LOCATION_MODE_OFF);
    } else {
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        isAvailable = !TextUtils.isEmpty(locationProviders);
    }

    boolean coarsePermissionCheck = (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
    boolean finePermissionCheck = (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);

    return isAvailable && (coarsePermissionCheck || finePermissionCheck);
}

Symbol Manifest.permission.ACCESS_COARSE_LOCATION und Manifest.permission.ACCESS_FINE_LOCATION
Gennady Kozlov

Verwenden Sie android.Manifest.permission.ACCESS_FINE_LOCATION
aLIEz

7

Wenn kein Anbieter aktiviert ist, ist "passiv" der beste zurückgegebene Anbieter. Siehe https://stackoverflow.com/a/4519414/621690

    public boolean isLocationServiceEnabled() {
        LocationManager lm = (LocationManager)
                this.getSystemService(Context.LOCATION_SERVICE);
        String provider = lm.getBestProvider(new Criteria(), true);
        return (StringUtils.isNotBlank(provider) &&
                !LocationManager.PASSIVE_PROVIDER.equals(provider));
    }

7

Ja, Sie können unten den Code überprüfen:

public boolean isGPSEnabled(Context mContext) 
{
    LocationManager lm = (LocationManager)
    mContext.getSystemService(Context.LOCATION_SERVICE);
    return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

mit der Erlaubnis in der Manifestdatei:

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

6

Diese if-Klausel überprüft meiner Meinung nach leicht, ob Ortungsdienste verfügbar sind:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
        //All location services are disabled

}

4

Ich benutze so für NETWORK_PROVIDER, aber Sie können hinzufügen und für GPS .

LocationManager locationManager;

In onCreate habe ich gesetzt

   isLocationEnabled();
   if(!isLocationEnabled()) {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle(R.string.network_not_enabled)
                .setMessage(R.string.open_location_settings)
                .setPositiveButton(R.string.yes,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                            }
                        })
                .setNegativeButton(R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alert = builder.create();
        alert.show();
    } 

Und Methode der Überprüfung

protected boolean isLocationEnabled(){
    String le = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) getSystemService(le);
    if(!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        return false;
    } else {
        return true;
    }
}

2
Sie brauchen nicht, wenn-dann-sonst, können Sie einfach zurückkehrenlocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
LadyWoodi

4

Dies ist eine sehr nützliche Methode, die " true" zurückgibt, wenn die Location servicesaktiviert sind:

public static boolean locationServicesEnabled(Context context) {
        LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean gps_enabled = false;
        boolean net_enabled = false;

        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
            Log.e(TAG,"Exception gps_enabled");
        }

        try {
            net_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
            Log.e(TAG,"Exception network_enabled");
        }
        return gps_enabled || net_enabled;
}

3

Um den aktuellen Geo- Standort in Android Google Maps zu erhalten, sollten Sie die Option für den Standort Ihres Geräts aktivieren. Um zu überprüfen, ob der Standort aktiviert ist oder nicht, können Sie diese Methode einfach über Ihre onCreate()Methode aufrufen .

private void checkGPSStatus() {
    LocationManager locationManager = null;
    boolean gps_enabled = false;
    boolean network_enabled = false;
    if ( locationManager == null ) {
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    }
    try {
        gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex){}
    try {
        network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex){}
    if ( !gps_enabled && !network_enabled ){
        AlertDialog.Builder dialog = new AlertDialog.Builder(MyActivity.this);
        dialog.setMessage("GPS not enabled");
        dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                //this will navigate user to the device location settings screen
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
        });
        AlertDialog alert = dialog.create();
        alert.show();
    }
}

3

Für Kotlin

 private fun isLocationEnabled(mContext: Context): Boolean {
    val lm = mContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    return lm.isProviderEnabled(LocationManager.GPS_PROVIDER) || lm.isProviderEnabled(
            LocationManager.NETWORK_PROVIDER)
 }

Dialog

private fun showLocationIsDisabledAlert() {
    alert("We can't show your position because you generally disabled the location service for your device.") {
        yesButton {
        }
        neutralPressed("Settings") {
            startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
        }
    }.show()
}

so anrufen

 if (!isLocationEnabled(this.context)) {
        showLocationIsDisabledAlert()
 }

Hinweis: Der Dialog benötigt die folgenden Importe (Android Studio sollte dies für Sie erledigen)

import org.jetbrains.anko.alert
import org.jetbrains.anko.noButton

Und im Manifest benötigen Sie die folgenden Berechtigungen

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

2

Sie können die Standortaktualisierungen anfordern und den Dialog gemeinsam anzeigen, wie dies auch bei GoogleMaps doas der Fall ist. Hier ist der Code:

googleApiClient = new GoogleApiClient.Builder(getActivity())
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).build();
googleApiClient.connect();

LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(30 * 1000);
locationRequest.setFastestInterval(5 * 1000);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest);

builder.setAlwaysShow(true); //this is the key ingredient

PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
    @Override
    public void onResult(LocationSettingsResult result) {
        final Status status = result.getStatus();
        final LocationSettingsStates state = result.getLocationSettingsStates();
        switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:
                // All location settings are satisfied. The client can initialize location
                // requests here.
                break;
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                // Location settings are not satisfied. But could be fixed by showing the user
                // a dialog.
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    status.startResolutionForResult(getActivity(), 1000);
                } catch (IntentSender.SendIntentException ignored) {}
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Location settings are not satisfied. However, we have no way to fix the
                // settings so we won't show the dialog.
                break;
            }
        }
    });
}

Wenn Sie weitere Informationen benötigen, überprüfen Sie die LocationRequest- Klasse.


Hallo, ich habe seit zwei Tagen Probleme, den aktuellen Standort des Benutzers zu ermitteln. Ich brauche die aktuelle Lat-Länge des Nutzers, ich weiß, dass dies mit dem Google API-Client möglich ist. Aber wie man Marshmallow-Erlaubnis darin integriert. Wenn die Ortungsdienste des Benutzers deaktiviert sind, erfahren Sie, wie Sie sie aktivieren. Kannst du helfen?
Chetna

Hallo! Sie haben viele Fragen, was ich in Kommentaren nicht beantworten kann. Bitte stellen Sie eine neue Frage, damit ich sie offizieller beantworten kann!
Bendaf

Ich habe meine Frage hier gepostet: stackoverflow.com/questions/39327480/…
Chetna

2

Ich benutze den ersten Code begin create Methode isLocationEnabled

 private LocationManager locationManager ;

protected boolean isLocationEnabled(){
        String le = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) getSystemService(le);
        if(!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
            return false;
        } else {
            return true;
        }
    }

und ich überprüfe Bedingung, wenn ture Öffnen Sie die Karte und geben Sie die falsche Absicht ACTION_LOCATION_SOURCE_SETTINGS

    if (isLocationEnabled()) {
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        locationClient = getFusedLocationProviderClient(this);
        locationClient.getLastLocation()
                .addOnSuccessListener(new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        // GPS location can be null if GPS is switched off
                        if (location != null) {
                            onLocationChanged(location);

                            Log.e("location", String.valueOf(location.getLongitude()));
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e("MapDemoActivity", e.toString());
                        e.printStackTrace();
                    }
                });


        startLocationUpdates();

    }
    else {
        new AlertDialog.Builder(this)
                .setTitle("Please activate location")
                .setMessage("Click ok to goto settings else exit.")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        startActivity(intent);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        System.exit(0);
                    }
                })
                .show();
    }

Geben Sie hier die Bildbeschreibung ein


1

Kann auf einfachste Weise tun

private boolean isLocationEnabled(Context context){
int mode =Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
                        Settings.Secure.LOCATION_MODE_OFF);
                final boolean enabled = (mode != android.provider.Settings.Secure.LOCATION_MODE_OFF);
return enabled;
}

1

Wenn Sie AndroidX verwenden, verwenden Sie den folgenden Code, um zu überprüfen, ob der Ortungsdienst aktiviert ist oder nicht:

fun isNetworkServiceEnabled(context: Context) = LocationManagerCompat.isLocationEnabled(context.getSystemService(LocationManager::class.java))

0

Um nach einem Netzwerkanbieter zu suchen, müssen Sie nur die an isProviderEnabled übergebene Zeichenfolge in LocationManager.NETWORK_PROVIDER ändern, wenn Sie die Rückgabewerte sowohl für den GPS-Anbieter als auch für den NETwork-Anbieter überprüfen. Beide Werte bedeuten, dass keine Standortdienste vorhanden sind


0
private boolean isGpsEnabled()
{
    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    return service.isProviderEnabled(LocationManager.GPS_PROVIDER)&&service.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

0
    LocationManager lm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
    boolean gps_enabled = false;
    boolean network_enabled = false;

    try {
        gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch(Exception e){
         e.printStackTrace();
    }

    try {
        network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch(Exception e){
         e.printStackTrace();
    }

    if(!gps_enabled && !network_enabled) {
        // notify user
        new AlertDialog.Builder(this)
                .setMessage("Please turn on Location to continue")
                .setPositiveButton("Open Location Settings", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }

                }).
                setNegativeButton("Cancel",null)
                .show();
    }

0
public class LocationUtil {
private static final String TAG = LocationUtil.class.getSimpleName();

public static LocationManager getLocationManager(final Context context) {
    return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}

public static boolean isNetworkProviderEnabled(final Context context) {
    return getLocationManager(context).isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

public static boolean isGpsProviderEnabled(final Context context) {
    return getLocationManager(context).isProviderEnabled(LocationManager.GPS_PROVIDER);
}

// Returns true even if the location services are disabled. Do not use this method to detect location services are enabled.
private static boolean isPassiveProviderEnabled(final Context context) {
    return getLocationManager(context).isProviderEnabled(LocationManager.PASSIVE_PROVIDER);
}

public static boolean isLocationModeOn(final Context context) throws Exception {
    int locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
    return locationMode != Settings.Secure.LOCATION_MODE_OFF;
}

public static boolean isLocationEnabled(final Context context) {
    try {
        return isNetworkProviderEnabled(context) || isGpsProviderEnabled(context)  || isLocationModeOn(context);
    } catch (Exception e) {
        Log.e(TAG, "[isLocationEnabled] error:", e);
    }
    return false;
}

public static void gotoLocationSettings(final Activity activity, final int requestCode) {
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    activity.startActivityForResult(intent, requestCode);
}

public static String getEnabledProvidersLogMessage(final Context context){
    try{
        return "[getEnabledProvidersLogMessage] isNetworkProviderEnabled:"+isNetworkProviderEnabled(context) +
                ", isGpsProviderEnabled:" + isGpsProviderEnabled(context) +
                ", isLocationModeOn:" + isLocationModeOn(context) +
                ", isPassiveProviderEnabled(ignored):" + isPassiveProviderEnabled(context);
    }catch (Exception e){
        Log.e(TAG, "[getEnabledProvidersLogMessage] error:", e);
        return "provider error";
    }
}

}}

Verwenden Sie die Methode isLocationEnabled, um festzustellen, ob die Ortungsdienste aktiviert sind.

Auf der Seite https://github.com/Polidea/RxAndroidBle/issues/327# finden Sie weitere Informationen, warum Sie nicht den passiven Anbieter verwenden, sondern den Standortmodus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.