Làm cách nào để kiểm tra nếu Dịch vụ vị trí được bật?


228

Tôi đang phát triển một ứng dụng trên HĐH Android. Tôi không biết cách kiểm tra xem Dịch vụ vị trí có được bật hay không.

Tôi cần một phương thức trả về "true" nếu chúng được kích hoạt và "false" nếu không (vì vậy trong trường hợp cuối cùng tôi có thể hiển thị một hộp thoại để kích hoạt chúng).


3
Tôi biết đây là một chủ đề cũ, nhưng đối với những người có thể theo dõi ... Google đã phát hành API cho việc này; xem nhà phát
triển.google.com


FYI: SettingsApi không được dùng nữa. Thay vào đó, hãy sử dụng developers.google.com/android/reference/com/google/android/gms/ .
Rajiv

Câu trả lời:


361

Bạn có thể sử dụng mã dưới đây để kiểm tra xem nhà cung cấp gps và nhà cung cấp mạng có được bật hay không.

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

Và trong tệp kê khai, bạn sẽ cần thêm các quyền sau

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

Cảm ơn bạn vì mật mã. Kiểm tra trình quản lý vị trí: lm.getAllProviders().contains(LocationManager.GPS_PROVIDER)(hoặc NETWORK_PROVIDER) sẽ đảm bảo rằng bạn không ném người dùng đến trang cài đặt nơi không có tùy chọn mạng.
petter

26
Ngoài ra: Settings.ACTION_SECURITY_SETTINGSnên làSettings.ACTION_LOCATION_SOURCE_SETTINGS
petter

2
bạn có thể kiểm tra xem điện thoại có ở chế độ máy bay không và xử lý nó .... stackoverflow.com/questions/4319212/ Kẻ
John

2
Tôi đã gặp một số vấn đề với lm.isProviderEnables (LocationManager.GPS_PROVIDER) được sử dụng để trả về luôn luôn sai. Điều này dường như xảy ra khi bạn sử dụng phiên bản mới của Dịch vụ Play: phiên bản hiển thị hộp thoại nơi bạn có thể bật gps ngay từ hộp thoại mà không hiển thị hoạt động cài đặt. Khi người dùng bật gps từ hộp thoại đó, câu lệnh đó luôn trả về sai, ngay cả khi bật gps
Marcelo Noguti

7
cũng không nên đặt các khối thử bắt trống rỗng, khó hiểu, vô dụng
Chisko

225

Tôi sử dụng mã này để kiểm tra:

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
Để rõ ràng, có thể muốn trả về false trong khối bắt. Khác khởi tạo locationMode thành Cài đặt.Secure.LOCATION_MODE_OFF.
RyanLeonard

2
Đây là một câu trả lời tốt vì nó hoạt động với cả API vị trí Android cũ và mới.
Diederik

2
LOCATION_PROVIDERS_ALLOWED - link Hằng số này không được dùng ở cấp độ API 19. Chúng ta phải sử dụng LOCATION_MODE và MODE_CHANGED_ACTION (hoặc PROVIDERS_CHANGED_ACTION)
Choletski

3
Câu trả lời này nên được chấp nhận là câu trả lời đúng. Phương thức locationManager.isProviderEnables () không đáng tin cậy trên thiết bị 4.4 của tôi (và như tôi thấy các nhà phát triển khác cũng gặp vấn đề tương tự trên các phiên bản HĐH khác). Trong trường hợp của tôi, nó trả về true cho GPS trong từng trường hợp (không thành vấn đề nếu dịch vụ định vị được bật hay không). Cảm ơn giải pháp tuyệt vời này!
người mạnh mẽ

2
Điều này không hoạt động trên thiết bị thử nghiệm của tôi, Samsung SHV-E160K, android 4.1.2, API 16. Mặc dù tôi tạo GPS ngoại tuyến, chức năng này vẫn trả về đúng. Tôi đã thử nghiệm trên Android Nougat, API 7.1 nó hoạt động
HendraWD

38

Như bây giờ vào năm 2020

Cách mới nhất, tốt nhất và ngắn nhất là

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
Thông minh ! Nhưng thậm chí tốt hơn, loại bỏ việc truyền và trực tiếp vượt qua LocationManager.classtrong getSystemServicephương thức vì cuộc gọi yêu cầu API 23 ;-)
Mackovich

6
Hoặc bạn có thể sử dụng LocationManagerCompat thay thế. :)
Mokkun

Sử dụng return lm! = Null && lm.isLocationEnables (); thay vì trả lại lm.isLocationEnables ();
Bác sĩ DS

35

Bạn có thể sử dụng mã này để hướng người dùng đến Cài đặt, nơi họ có thể bật 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
Rất cám ơn, nhưng tôi không cần mã để kiểm tra GPS mà chỉ cần dịch vụ định vị.
Meroelyth

1
dịch vụ định vị luôn có sẵn, nhưng các nhà cung cấp khác nhau có thể không có.
lenik

4
@lenik, một số thiết bị cung cấp cài đặt (trong "Cài đặt> Cá nhân> Dịch vụ vị trí> Truy cập vào vị trí của tôi") dường như bật / tắt hoàn toàn phát hiện vị trí, ngay cả khi nhà cung cấp cụ thể được bật. Tôi đã tận mắt nhìn thấy chiếc điện thoại này mà tôi đang thử nghiệm và mặc dù cả Wifi và GPS đều được bật nhưng chúng dường như đã chết ... với ứng dụng của tôi. Thật không may, kể từ khi tôi bật cài đặt và không còn có thể tái tạo kịch bản gốc, ngay cả khi tắt cài đặt "Truy cập vào vị trí của tôi". Vì vậy, tôi không thể nói nếu cài đặt đó ảnh hưởng đến isProviderEnabled()getProviders(true)phương thức.
Gấu Awnry

... Tôi chỉ muốn ném nó ra khỏi đó trong trường hợp người khác gặp phải vấn đề tương tự. Tôi chưa bao giờ thấy cài đặt trước đây trên các thiết bị khác mà tôi đã thử nghiệm. Nó dường như là một công tắc tiêu diệt phát hiện vị trí trên toàn hệ thống. Nếu bất cứ ai có bất kỳ kinh nghiệm nào về cách thức isProviderEnabled()getProviders(true)phương thức phản hồi khi cài đặt như vậy được bật (hoặc bị vô hiệu hóa, tùy thuộc vào cách bạn nhìn vào nó), tôi sẽ rất tò mò muốn biết những gì bạn đã gặp phải.
Gấu Awnry

25

Di chuyển sang Android X và sử dụng

implementation 'androidx.appcompat:appcompat:1.1.0'

và sử dụng LocationManagerCompat

Trong java

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

Ở Kotlin

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

Điều này hoạt động cho tất cả các phiên bản Android kể từ Android 1.0. Nhưng lưu ý Before API version LOLLIPOP [API Level 21], this method would throw SecurityException if the location permissions were not sufficient to use the specified provider.Vì vậy, nếu bạn không có quyền đối với mạng hoặc nhà cung cấp gps, nó có thể đưa ra một ngoại lệ, tùy thuộc vào việc được bật. Kiểm tra mã nguồn để biết thêm.
xuiqzy

15

Làm việc với câu trả lời ở trên, trong API 23, bạn cần thêm kiểm tra quyền "nguy hiểm" cũng như kiểm tra chính hệ thống:

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

Không thể giải quyết biểu tượng Manifest-01.ACCESS_COARSE_LOCATION và Manifest
01.ACCESS_FINE_LOCATION

Sử dụng android.Manifest
01.ACCESS_FINE_LOCATION

7

Nếu không có nhà cung cấp nào được kích hoạt, "thụ động" là nhà cung cấp tốt nhất được trả về. Xem 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

Có bạn có thể kiểm tra bên dưới là mã:

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

với sự cho phép trong tệp kê khai:

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

6

Điều này nếu mệnh đề dễ dàng kiểm tra nếu dịch vụ định vị có sẵn theo ý kiến ​​của tôi:

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

}

4

Tôi sử dụng cách đó cho NETWORK_PROVIDER nhưng bạn có thể thêm và cho GPS .

LocationManager locationManager;

Trong onCreate tôi đặt

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

Và phương pháp kiểm tra

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

2
Bạn không cần if-then- locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
other

4

Đây là một phương thức rất hữu ích trả về " true" nếu Location servicesđược bật:

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

Để có được vị trí Geo hiện tại trong bản đồ google android, bạn nên bật tùy chọn vị trí thiết bị của mình. Để kiểm tra xem vị trí có bật hay không, bạn có thể gọi phương thức này từ onCreate()phương thức của mình một cách đơn giản .

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

Đối với kotlin

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

hộp thoại

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

gọi như thế này

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

Gợi ý: hộp thoại cần nhập sau (studio android nên xử lý việc này cho bạn)

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

Và trong tệp kê khai bạn cần các quyền sau

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

2

Bạn có thể yêu cầu cập nhật vị trí và hiển thị hộp thoại cùng nhau, như GoogleMaps doas. Đây là mã:

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

Nếu bạn cần thêm thông tin, hãy kiểm tra lớp LocationRequest .


Xin chào, tôi đã vật lộn từ hai ngày qua để có được vị trí hiện tại của người dùng. Tôi cần lat lat hiện tại của người dùng, tôi biết điều đó có thể được thực hiện bằng cách sử dụng google api client. Nhưng làm thế nào để tích hợp quyền marshmallow trong đó. Ngoài ra, nếu dịch vụ định vị của người dùng được bật, làm thế nào để kích hoạt nó. Bạn có thể giúp?
Chetna

Chào! bạn có rất nhiều câu hỏi, những gì tôi không thể trả lời trong các bình luận. Hãy hỏi một câu hỏi mới để tôi có thể trả lời chính thức hơn!
uốn cong

Tôi đã đăng câu hỏi của mình lên đây: stackoverflow.com/questions/39327480/ từ
Chetna

2

tôi sử dụng mã đầu tiên bắt đầu tạo phương thức isLocationEnables

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

và tôi kiểm tra Điều kiện nếu ture Mở bản đồ và đưa ra ý định sai 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();
    }

nhập mô tả hình ảnh ở đây


1

Có thể làm theo cách đơn giản nhất

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

Nếu bạn đang sử dụng AndroidX, hãy sử dụng mã bên dưới để kiểm tra Dịch vụ vị trí có được bật hay không:

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

0

Để kiểm tra nhà cung cấp mạng, bạn chỉ cần thay đổi chuỗi được chuyển thành isProviderEnables thành LocationManager.NETWORK_PROVIDER nếu bạn kiểm tra giá trị trả về cho cả nhà cung cấp GPS và nhà cung cấp NETwork - cả hai đều sai có nghĩa là không có dịch vụ định vị


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

}

Sử dụng phương pháp isLocationEnables để phát hiện các dịch vụ định vị được bật.

https://github.com/Polidea/RxAndroidBle/issues/327# trang sẽ cung cấp thêm thông tin tại sao không sử dụng nhà cung cấp thụ động, thay vào đó sử dụng chế độ vị trí.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.