Вопрос по 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   ответов
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;
}
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);
    }


} 
LOCATION_PROVIDERS_ALLOWED -link Эта константа устарела на уровне API 19. Мы должны использовать LOCATION_MODE и MODE_CHANGED_ACTION (или PROVIDERS_CHANGED_ACTION)
Этот ответ должен был быть принят как правильный ответ. Метод locationManager.isProviderEnabled () не надежен на моем устройстве 4.4 (и, как я увидел, у других разработчиков такая же проблема возникала и на других версиях ОС). В моем случае он возвращает true для GPS в каждом случае (не имеет значения, включены ли службы определения местоположения или нет). Спасибо за это отличное решение!
Это хороший ответ, потому что он работает как со старым, так и с новым API определения местоположения Android.
Для ясности может потребоваться вернуть false в блоке catch. Иначе инициализируйте locationMode в Settings.Secure.LOCATION_MODE_OFF.
Это не сработало на моем тестовом устройстве, Samsung SHV-E160K, Android 4.1.2, API 16. Хотя я отключил GPS, эта функция все еще возвращает true. Я тестировал на Android Nougat, API 7.1 работает
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();
    }
}
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"/>
У меня были некоторые проблемы с lm.isProviderEnabled (LocationManager.GPS_PROVIDER), который всегда возвращал false. Похоже, это происходит при использовании новой версии Play Services: той, которая показывает диалоговое окно, в котором вы можете включить свой GPS прямо из диалогового окна, не показывая активность настроек. Когда пользователь отключает gps из этого диалога, этот оператор всегда возвращает false, даже если gps включен
Это не работает, если телефон находится в «режиме полета» ...
Также:Settings.ACTION_SECURITY_SETTINGS должно бытьSettings.ACTION_LOCATION_SOURCE_SETTINGS
@Accollativo, что делать, если телефон находится вairplane mode ???
также не следует ставить пустые, запутанные, бесполезные блоки try-catch
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

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

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

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

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

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

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

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

ваша ссылка 404, поэтому переполнение стека рекомендует не связывать
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));
    }

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