Как проверить, включены ли службы определения местоположения?

228

Я разрабатываю приложение на ОС Android. Я не знаю, как проверить, включены ли службы определения местоположения или нет.

Мне нужен метод, который возвращает «true», если они включены, и «false», если нет (поэтому в последнем случае я могу показать диалог, чтобы включить их).

Meroelyth
источник
3
Я знаю, что это старая тема, но для тех, кто может следовать ... Google выпустил API для этого; см. developers.google.com/android/reference/com/google/android/gms/…
Питер МакЛеннан
К вашему сведению: SettingsApi устарела. Вместо этого используйте developers.google.com/android/reference/com/google/android/gms/… .
Раджив

Ответы:

361

Вы можете использовать приведенный ниже код, чтобы проверить, включены ли gps-провайдеры и сетевые провайдеры.

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

И в файле манифеста, вам нужно будет добавить следующие разрешения

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Шанкар Агарвал
источник
Спасибо за код. Проверка менеджера местоположений: lm.getAllProviders().contains(LocationManager.GPS_PROVIDER)(или NETWORK_PROVIDER) убедится, что вы не бросаете пользователя на страницу настроек, где нет опции сети.
Петтер
26
Также: Settings.ACTION_SECURITY_SETTINGSдолжно бытьSettings.ACTION_LOCATION_SOURCE_SETTINGS
петтер
2
Вы можете проверить, находится ли телефон в режиме полета, и справиться с ним .... stackoverflow.com/questions/4319212/…
Джон
2
У меня были некоторые проблемы с lm.isProviderEnabled (LocationManager.GPS_PROVIDER), который всегда возвращал false. Это происходит, когда вы используете новую версию Play Services: ту, которая показывает диалоговое окно, в котором вы можете включить свой gps прямо из диалогового окна, не показывая активность настроек. Когда пользователь отключает gps из этого диалога, этот оператор всегда возвращает false, даже если gps
включен
7
также не следует ставить пустые, запутанные, бесполезные блоки try-catch
Chisko
225

Я использую этот код для проверки:

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
Для ясности может потребоваться вернуть false в блоке catch. Иначе инициализируйте locationMode в Settings.Secure.LOCATION_MODE_OFF.
RyanLeonard
2
Это хороший ответ, потому что он работает как со старым, так и с новым API определения местоположения Android.
Дидерик
2
LOCATION_PROVIDERS_ALLOWED - ссылка Эта константа устарела на уровне API 19. Мы должны использовать LOCATION_MODE и MODE_CHANGED_ACTION (или
PROVIDERS_CHANGED_ACTION
3
Этот ответ должен был быть принят как правильный ответ. Метод locationManager.isProviderEnabled () не надежен на моем устройстве 4.4 (и, как я увидел, у других разработчиков такая же проблема возникала и на других версиях ОС). В моем случае он возвращает true для GPS в каждом случае (не важно, включены службы определения местоположения или нет). Спасибо за это отличное решение!
strongmayer
2
Это не сработало на моем тестовом устройстве Samsung SHV-E160K, Android 4.1.2, API 16. Хотя я отключил GPS, эта функция все еще возвращает true. Я тестировал на Android Nougat, API 7.1 работает
HendraWD
38

Как сейчас в 2020

Последний, лучший и самый короткий путь

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
Превосходно ! Но еще лучше, чтобы избавиться от литья и непосредственно передать LocationManager.classв getSystemServiceметод , потому что вызов требует API 23 ;-)
Mackovich
6
Или вы можете использовать LocationManagerCompat вместо этого. :)
Моккун
Используйте return lm! = Null && lm.isLocationEnabled (); вместо return lm.isLocationEnabled ();
Доктор DS
35

Вы можете использовать этот код для направления пользователей в Настройки, где они могут включить 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();
    }
Lenik
источник
1
Большое спасибо, но мне не нужен код для проверки GPS, а только службы определения местоположения.
Meroelyth
1
услуги определения местоположения всегда доступны, но разные поставщики могут быть недоступны.
lenik
4
@lenik, некоторые устройства предоставляют настройку (в «Настройках> Личные> Службы определения местоположения> Доступ к моему местоположению»), которая, кажется, включает / отключает определение местоположения в целом, даже если включены определенные поставщики. Я видел это из первых рук с телефоном, с которым я тестировал, и хотя Wi-Fi и GPS были включены, они казались мертвыми ... для моего приложения. К сожалению, с тех пор я включил этот параметр и больше не могу воспроизводить исходный сценарий, даже когда отключен этот параметр «Доступ к моему местоположению». Поэтому я не могу сказать, что настройка влияет на isProviderEnabled()и getProviders(true)методы.
Медведь Ошри
... Я просто хотел выбросить это на тот случай, если кто-то столкнется с той же проблемой. Я никогда не видел настройки на других устройствах, с которыми я тестировал. Похоже, что это общесистемный переключатель для определения местоположения. Если у кого-то есть опыт относительно того, как реагируют методы isProviderEnabled()и, getProviders(true)когда такая настройка включена (или отключена, в зависимости от того, как вы на нее смотрите), мне было бы очень интересно узнать, с чем вы столкнулись.
Медведь Ошри
25

Перейдите на Android X и используйте

implementation 'androidx.appcompat:appcompat:1.1.0'

и использовать LocationManagerCompat

В яве

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

В котлине

private fun isLocationEnabled(context: Context): Boolean {
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    return LocationManagerCompat.isLocationEnabled(locationManager)
}
Солнечно
источник
Это работает для всех версий Android начиная с Android 1.0. Но обратите внимание: Before API version LOLLIPOP [API Level 21], this method would throw SecurityException if the location permissions were not sufficient to use the specified provider.если у вас нет прав доступа к сети или провайдеру GPS, он может выдать исключение, в зависимости от того, какой из них включен. Проверьте исходный код для получения дополнительной информации.
xuiqzy
15

Отрабатывая ответ выше, в API 23 вам нужно добавить «опасные» проверки разрешений, а также проверку самой системы:

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);
}
ZaBlanc
источник
Не удается разрешить символы Manifest.permission.ACCESS_COARSE_LOCATION и Manifest.permission.ACCESS_FINE_LOCATION
Геннадий Козлов
Используйте android.Manifest.permission.ACCESS_FINE_LOCATION
aLIEz
7

Если ни один провайдер не включен, «пассивный» является лучшим возвращенным провайдером. См. 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));
    }
Risadinha
источник
7

Да, вы можете проверить ниже код:

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

с разрешения в файле манифеста:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Арун Кумар
источник
6

Это если пункт легко проверяет, доступны ли услуги определения местоположения, по моему мнению:

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

}
tsemann
источник
4

Я использую такой способ для NETWORK_PROVIDER, но вы можете добавить и для GPS .

LocationManager locationManager;

В onCreate я положил

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

И метод проверки

protected boolean isLocationEnabled(){
    String le = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) getSystemService(le);
    if(!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        return false;
    } else {
        return true;
    }
}
П. дм
источник
2
Вам не нужно, если-то-то еще, вы можете просто вернутьсяlocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
LadyWoodi
4

Это очень полезный метод, который возвращает " true", если Location servicesвключены:

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;
}
Jorgesys
источник
3

Чтобы получить текущее географическое местоположение на картах Google Android, вы должны включить опцию местоположения вашего устройства. Чтобы проверить, включено местоположение или нет, вы можете просто вызвать этот метод из вашего onCreate()метода.

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();
    }
}
Ashana.Jackol
источник
3

Для котлин

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

диалог

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

позвони так

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

Подсказка: диалоговое окно нуждается в следующем импорте (Android Studio должна справиться с этим за вас)

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

И в манифесте вам нужны следующие разрешения

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
kuzdu
источник
2

Вы можете запросить обновления местоположения и показать диалог вместе, также как и в GoogleMaps. Вот код:

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

Если вам нужна дополнительная информация, проверьте класс LocationRequest .

bendaf
источник
Здравствуйте, я боролся с прошлых двух дней, чтобы получить текущее местоположение пользователя. Мне нужен текущий лат пользователя, я знаю, что это можно сделать с помощью клиента API Google. Но как интегрировать в него разрешение зефира. Плюс, если сервисы определения местоположения пользователя отключены, как это включить. Вы можете помочь?
Четна
Здравствуй! У вас много вопросов, на что я не могу ответить в комментариях. Пожалуйста, задайте новый вопрос, чтобы я мог ответить на него более официально!
bendaf
Я разместил свой вопрос здесь: stackoverflow.com/questions/39327480/…
Четна
2

я использую первый код начала создать метод 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;
        }
    }

и я проверяю Условие, если ture Откройте карту, и ложь дает намерение 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();
    }

введите описание изображения здесь

Понг Петрунг
источник
1

Можно сделать самым простым способом

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

Если вы используете AndroidX, используйте приведенный ниже код, чтобы проверить, включена служба определения местоположения или нет:

fun isNetworkServiceEnabled(context: Context) = LocationManagerCompat.isLocationEnabled(context.getSystemService(LocationManager::class.java))
btimalsina
источник
0

Чтобы проверить провайдера сети, вам просто нужно изменить строку, переданную isProviderEnabled, на LocationManager.NETWORK_PROVIDER, если вы проверяете возвращаемые значения как для провайдера GPS, так и для провайдера NETwork - оба значения false означают отсутствие служб определения местоположения

gheese
источник
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";
    }
}

}

Используйте метод isLocationEnabled, чтобы обнаружить, что службы определения местоположения включены.

Страница https://github.com/Polidea/RxAndroidBle/issues/327# даст больше информации, почему бы не использовать пассивный провайдер, вместо этого использовать режим местоположения.

alperk01
источник