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

188

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

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

I have answer similar question here with codes. Проверьте это. Очень полезно. S bruce
Я знаю, что это старая тема, но для тех, кто может следовать ... Google выпустил API для этого; увидетьdevelopers.google.com/android/reference/com/google/android/gms/… Peter McLennan

Ваш Ответ

18   ответов
320

чтобы проверить, включены ли 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"/>
также не следует ставить пустые, запутанные, бесполезные блоки try-catch
Также:Settings.ACTION_SECURITY_SETTINGS должно бытьSettings.ACTION_LOCATION_SOURCE_SETTINGS
@Accollativo, что делать, если телефон находится вairplane mode ???
Это не работает, если телефон находится в «режиме полета» ...
У меня были некоторые проблемы с lm.isProviderEnabled (LocationManager.GPS_PROVIDER), который всегда возвращал false. Похоже, это происходит при использовании новой версии Play Services: той, которая показывает диалоговое окно, в котором вы можете включить свой GPS прямо из диалогового окна, не показывая активность настроек. Когда пользователь отключает gps из этого диалога, этот оператор всегда возвращает false, даже если gps включен
0

Can do in simplest way

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

}
214

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


} 
Для ясности может потребоваться вернуть false в блоке catch. Иначе инициализируйте locationMode в Settings.Secure.LOCATION_MODE_OFF.
Этот ответ должен был быть принят как правильный ответ. Метод locationManager.isProviderEnabled () не надежен на моем устройстве 4.4 (и, как я увидел, у других разработчиков такая же проблема возникала и на других версиях ОС). В моем случае он возвращает true для GPS в каждом случае (не имеет значения, включены ли службы определения местоположения или нет). Спасибо за это отличное решение!
LOCATION_PROVIDERS_ALLOWED -link Эта константа устарела на уровне API 19. Мы должны использовать LOCATION_MODE и MODE_CHANGED_ACTION (или PROVIDERS_CHANGED_ACTION)
Это хороший ответ, потому что он работает как со старым, так и с новым API определения местоположения Android.
Это не сработало на моем тестовом устройстве, Samsung SHV-E160K, Android 4.1.2, API 16. Хотя я отключил GPS, эта функция все еще возвращает true. Я тестировал на Android Nougat, API 7.1 работает
0
private boolean isGpsEnabled()
{
    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    return service.isProviderEnabled(LocationManager.GPS_PROVIDER)&&service.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
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 учебный класс.

2

current Geo Расположение в Android Google Maps, выshould turn on your device location Чтобы проверить, включено местоположение или нет, вы можете просто вызвать этот метод из вашего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();
    }
}
13

опасный & quot; проверка разрешений, а также проверка самой системы:

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

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

enter image description here

4

у Google есть API, который очень хорошо работает с новым провайдером локации. Полностью проработанный пример Пример кода Google на Github  Вам не нужно кодировать диалог пользователя, чтобы попросить его изменить настройки, как это делается автоматически с помощью API.

ваша ссылка 404, поэтому переполнение стека рекомендует не связывать
2

 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"/>
3

Я использую такой способ для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;
    }
}
Вам не нужно, если-то-иначе, вы можете просто вернутьсяlocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
3

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

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

        }
    }
30

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

true& Quot; если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;
}
0

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

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

Похожие вопросы