Jak sprawdzić, czy usługi lokalizacyjne są włączone?


228

Tworzę aplikację na system operacyjny Android. Nie wiem, jak sprawdzić, czy Usługi lokalizacyjne są włączone, czy nie.

Potrzebuję metody, która zwraca „prawda”, jeśli są włączone, i „fałsz”, jeśli nie (więc w ostatnim przypadku mogę wyświetlić okno dialogowe, aby je włączyć).


3
Wiem, że to stary temat, ale dla tych, którzy mogą śledzić ... Google wydało API do tego; patrz developers.google.com/android/reference/com/google/android/gms/…
Peter McLennan

Mam podobne pytanie tutaj z kodami. Sprawdź to. Bardzo pomocne.
S bruce

FYI: SettingsApi jest teraz przestarzałe. Zamiast tego użyj developers.google.com/android/reference/com/google/android/gms/… .
Rajiv

Odpowiedzi:


361

Możesz użyć poniższego kodu, aby sprawdzić, czy dostawca GPS i dostawcy sieci są włączeni, czy nie.

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

W pliku manifestu musisz dodać następujące uprawnienia

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

Dziękuję za kod. Sprawdzanie menedżera lokalizacji: lm.getAllProviders().contains(LocationManager.GPS_PROVIDER)(lub NETWORK_PROVIDER) upewni się, że użytkownik nie wyrzuci użytkownika na stronę ustawień, na której nie ma opcji sieci.
petter

26
Ponadto: Settings.ACTION_SECURITY_SETTINGSpowinno byćSettings.ACTION_LOCATION_SOURCE_SETTINGS
petter

2
możesz sprawdzić, czy telefon jest w trybie samolotowym, i poradzić sobie z nim .... stackoverflow.com/questions/4319212/…
Jan

2
Miałem pewne problemy z lm.isProviderEnabled (LocationManager.GPS_PROVIDER), które zawsze zwracały wartość false. Wydaje się, że dzieje się tak, gdy korzystasz z nowej wersji usług Play: tej, która pokazuje okno dialogowe, w którym możesz włączyć GPS bezpośrednio z okna dialogowego, bez pokazywania aktywności ustawień. Gdy użytkownik zamienia GPS z tego okna dialogowego, ta instrukcja zawsze zwraca wartość false, nawet gdy GPS jest włączony
Marcelo Noguti

7
również nie należy stawiać pustych, mylących, bezużytecznych bloków typu try-catch
Chisko,

225

Używam tego kodu do sprawdzania:

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
Dla jasności warto zwrócić wartość false w bloku catch. W przeciwnym razie zainicjuj lokalizację Mode do Settings.Secure.LOCATION_MODE_OFF.
RyanLeonard

2
To dobra odpowiedź, ponieważ działa zarówno ze starymi, jak i nowymi interfejsami API lokalizacji Androida.
Diederik,

2
LOCATION_PROVIDERS_ALLOWED - link Ta stała została uznana za przestarzałą na poziomie API 19. Musimy użyć LOCATION_MODE i MODE_CHANGED_ACTION (lub PROVIDERS_CHANGED_ACTION)
Choletski

3
Ta odpowiedź powinna zostać zaakceptowana jako poprawna. Metoda locationManager.isProviderEnabled () nie jest niezawodna na moim urządzeniu 4.4 (i jak zauważyłem, inni programiści mieli ten sam problem również w innych wersjach systemu operacyjnego). W moim przypadku zwraca wartość true dla GPS w każdym przypadku (nie ma znaczenia, czy usługi lokalizacyjne są włączone, czy nie). Dzięki za to świetne rozwiązanie!
strongmayer,

2
To nie zadziałało na moim urządzeniu testowym, Samsung SHV-E160K, Android 4.1.2, API 16. Mimo że przełączam GPS w tryb offline, ta funkcja nadal jest prawdziwa. Testowałem na Androidzie Nougat, API 7.1 działa
HendraWD

38

Tak jak teraz w 2020 roku

Najnowsza, najlepsza i najkrótsza droga to

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
Doskonały ! Ale jeszcze lepiej, pozbyć się odlewanie i bezpośrednio przekazać LocationManager.classw getSystemServicesposób, ponieważ wymaga połączenia API 23 ;-)
Mackovich

6
Lub możesz zamiast tego użyć LocationManagerCompat . :)
Mokkun,

Użyj return lm! = Null && lm.isLocationEnabled (); zamiast zwracać lm.isLocationEnabled ();
Dr DS

35

Możesz użyć tego kodu, aby skierować użytkowników do Ustawień, gdzie mogą włączyć GPS:

    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
Wielkie dzięki, ale nie potrzebuję kodu, aby sprawdzić GPS, ale tylko usługi lokalizacyjne.
Meroelyth,

1
usługi lokalizacyjne są zawsze dostępne, ale różni dostawcy mogą być niedostępni.
lenik,

4
@lenik, niektóre urządzenia zapewniają ustawienie (w „Ustawienia> Osobiste> Usługi lokalizacyjne> Dostęp do mojej lokalizacji”), które wydaje się całkowicie włączać / wyłączać wykrywanie lokalizacji, nawet jeśli włączeni są konkretni dostawcy. Widziałem to z pierwszej ręki z telefonem, z którym testowałem, i chociaż zarówno Wi-Fi, jak i GPS były włączone, wydawały się martwe ... w mojej aplikacji. Niestety, ponieważ włączyłem to ustawienie i nie mogę już odtworzyć oryginalnego scenariusza, nawet po wyłączeniu tego ustawienia „Dostęp do mojej lokalizacji”. Nie mogę więc powiedzieć, czy to ustawienie wpływa na metody isProviderEnabled()i getProviders(true).
The Awnry Bear

... Chciałem to wyrzucić na wypadek, gdyby ktoś napotkał ten sam problem. Nigdy wcześniej nie widziałem tego ustawienia na innych urządzeniach, z którymi testowałem. Wygląda na to, że jest to ogólnosystemowy przełącznik zabijania wykrywający lokalizację. Jeśli ktoś ma jakiekolwiek doświadczenie dotyczące reakcji isProviderEnabled()i getProviders(true)metod, gdy takie ustawienie jest włączone (lub wyłączone, w zależności od tego, jak na to spojrzysz), byłbym bardzo ciekawy, aby dowiedzieć się, co napotkałeś.
The Awnry Bear

25

Przeprowadź migrację do Androida X i użyj

implementation 'androidx.appcompat:appcompat:1.1.0'

i użyj LocationManagerCompat

W java

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

W Kotlinie

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

Działa to dla wszystkich wersji Androida od Androida 1.0. Pamiętaj jednak, że Before API version LOLLIPOP [API Level 21], this method would throw SecurityException if the location permissions were not sufficient to use the specified provider.jeśli nie masz uprawnień dla sieci lub dostawcy GPS, może zgłosić wyjątek, w zależności od tego, które jest włączone. Sprawdź kod źródłowy, aby uzyskać więcej informacji.
xuiqzy

15

Opracowując powyższą odpowiedź, w API 23 należy dodać „niebezpieczne” kontrole uprawnień, a także sprawdzenie samego systemu:

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

Nie można rozwiązać symbolu Manifest.permission.ACCESS_COARSE_LOCATION i Manifest.permission.ACCESS_FINE_LOCATION
Giennadij Kozłow

Użyj android.Manifest.permission.ACCESS_FINE_LOCATION
aLIEz

7

Jeśli żaden dostawca nie jest włączony, „pasywny” jest najlepszym zwróconym dostawcą. Zobacz 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

Tak, możesz sprawdzić poniżej to kod:

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

za zgodą w pliku manifestu:

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

6

To, jeśli klauzula łatwo sprawdza, czy moim zdaniem usługi lokalizacyjne są dostępne:

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

}

4

Używam takiego sposobu dla NETWORK_PROVIDER, ale możesz dodać i dla GPS .

LocationManager locationManager;

W onCreate umieściłem

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

I metoda sprawdzania

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

2
Nie potrzebujesz, jeśli-to-inaczej, możesz po prostu wrócićlocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
LadyWoodi

4

Jest to bardzo przydatna metoda, która zwraca „ true”, jeśli Location servicessą włączone:

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

Aby uzyskać bieżącą lokalizację geograficzną w mapach Google na Androida, należy włączyć opcję lokalizacji urządzenia. Aby sprawdzić, czy lokalizacja jest włączona, możesz po prostu wywołać tę metodę ze swojej onCreate()metody.

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

Dla kotlina

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

zadzwoń w ten sposób

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

Wskazówka: okno dialogowe wymaga następującego importu (studio Android powinno to obsłużyć)

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

W manifeście potrzebujesz następujących uprawnień

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

2

Możesz poprosić o aktualizację lokalizacji i wyświetlić okno dialogowe razem, podobnie jak pliki GoogleMaps. Oto kod:

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

Jeśli potrzebujesz więcej informacji, sprawdź klasę LocationRequest .


Witaj, od dwóch dni staram się uzyskać aktualną lokalizację użytkownika. Potrzebuję aktualnej długości użytkownika, wiem, że można to zrobić za pomocą klienta Google API. Ale jak włączyć w to pozwolenie na ptasie mleczko. Plus, jeśli usługi lokalizacyjne użytkownika są wyłączone, jak to włączyć. Możesz pomóc?
Chetna

Cześć! masz wiele pytań, na które nie mogę odpowiedzieć w komentarzach. Zadaj nowe pytanie, abym mógł odpowiedzieć na nie bardziej oficjalnie!
bendaf


2

używam pierwszego kodu rozpocząć tworzenie metody 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;
        }
    }

i sprawdzam Warunek, jeśli otwiera mapę i fałsz daje zamiar 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();
    }

wprowadź opis zdjęcia tutaj


1

Można to zrobić w najprostszy sposób

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

Jeśli używasz systemu AndroidX, użyj poniższego kodu, aby sprawdzić, czy usługa lokalizacji jest włączona, czy nie:

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

0

Aby sprawdzić dostawcę sieci, wystarczy zmienić ciąg przekazany na isProviderEnabled do LocationManager.NETWORK_PROVIDER, jeśli zaznaczysz wartości zwracane zarówno dla dostawcy GPS, jak i dostawcy sieci - oba false oznaczają brak usług lokalizacyjnych


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";
    }
}

}

Użyj metody isLocationEnabled, aby wykryć, że usługi lokalizacyjne są włączone.

Strona https://github.com/Polidea/RxAndroidBle/issues/327# poda więcej informacji, dlaczego nie skorzystać z dostawcy pasywnego, zamiast korzystać z trybu lokalizacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.