Bagaimana cara memeriksa apakah Layanan Lokasi diaktifkan?

228

Saya sedang mengembangkan aplikasi di OS Android. Saya tidak tahu cara memeriksa apakah Layanan Lokasi diaktifkan atau tidak.

Saya membutuhkan metode yang mengembalikan "true" jika mereka diaktifkan dan "false" jika tidak (jadi dalam kasus terakhir saya dapat menampilkan dialog untuk mengaktifkannya).

Meroelyth
sumber
3
Saya tahu ini adalah topik lama, tetapi bagi mereka yang mungkin mengikuti ... Google telah merilis API untuk ini; lihat developers.google.com/android/reference/com/google/android/gms/…
Peter McLennan
Saya telah menjawab pertanyaan serupa di sini dengan kode. Saksikan berikut ini. Sangat membantu.
S bruce
FYI: SettingsApi sudah tidak digunakan lagi sekarang. Gunakan pengembang.google.com/android/reference/com/google/android/gms/… .
Rajiv

Jawaban:

361

Anda dapat menggunakan kode di bawah ini untuk memeriksa apakah penyedia gps dan penyedia jaringan diaktifkan atau tidak.

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

Dan dalam file manifes, Anda perlu menambahkan izin berikut

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Shankar Agarwal
sumber
Terima kasih untuk kodenya. Memeriksa manajer lokasi: lm.getAllProviders().contains(LocationManager.GPS_PROVIDER)(atau NETWORK_PROVIDER) akan memastikan bahwa Anda tidak membuang pengguna ke halaman pengaturan di mana tidak ada opsi jaringan.
petter
26
Juga: Settings.ACTION_SECURITY_SETTINGSharusSettings.ACTION_LOCATION_SOURCE_SETTINGS
petter
2
Anda dapat memeriksa untuk melihat apakah ponsel dalam mode pesawat dan menanganinya .... stackoverflow.com/questions/4319212/…
John
2
Saya punya beberapa masalah dengan lm.isProviderEnabled (LocationManager.GPS_PROVIDER) yang digunakan untuk mengembalikan selalu false. Ini tampaknya terjadi ketika Anda menggunakan versi baru dari Play Services: yang menampilkan dialog tempat Anda dapat mengaktifkan gps Anda langsung dari dialog, tanpa menunjukkan aktivitas pengaturan. Ketika pengguna mengubah gps dari dialog itu, pernyataan itu kembali selalu salah, bahkan ketika gps aktif
Marcelo Noguti
7
juga tidak boleh meletakkan blok try-catch yang kosong, membingungkan, tidak berguna
Chisko
225

Saya menggunakan kode ini untuk memeriksa:

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


} 
Slava Fir
sumber
7
Untuk kejelasan, mungkin ingin mengembalikan false di blok tangkap. Lain inisialisasi locationMode ke Settings.Secure.LOCATION_MODE_OFF.
RyanLeonard
2
Ini adalah jawaban yang bagus karena berfungsi dengan API lokasi Android lama dan baru.
Diederik
2
LOCATION_PROVIDERS_ALLOWED - tautan Konstanta ini tidak digunakan lagi di API level 19. Kita harus menggunakan LOCATION_MODE dan MODE_CHANGED_ACTION (atau PROVIDERS_CHANGED_ACTION)
Choletski
3
Jawaban ini seharusnya diterima sebagai jawaban yang benar. Metode locationManager.isProviderEnabled () tidak dapat diandalkan pada perangkat 4.4 saya (dan ketika saya melihat pengembang lain memiliki masalah yang sama pada versi OS lainnya juga). Dalam kasus saya ini mengembalikan true untuk GPS dalam setiap kasus (tidak masalah jika layanan lokasi diaktifkan atau tidak). Terima kasih atas solusi hebat ini!
strongmayer
2
Ini tidak berfungsi pada perangkat pengujian saya, Samsung SHV-E160K, android 4.1.2, API 16. Meskipun saya membuat GPS offline, fungsi ini masih kembali benar. Saya menguji pada Android Nougat, API 7.1 berfungsi
HendraWD
38

Seperti sekarang pada tahun 2020

Terbaru, Cara terbaik dan terpendek adalah

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

        }
    }
Mayank Sharma
sumber
1
Luar biasa! Tetapi bahkan lebih baik, menyingkirkan casting dan langsung lulus LocationManager.classdi getSystemServicemetode karena panggilan membutuhkan API 23 ;-)
Mackovich
6
Atau Anda bisa menggunakan LocationManagerCompat sebagai gantinya. :)
Mokkun
Gunakan return lm! = Null && lm.isLocationEnabled (); bukannya mengembalikan lm.isLocationEnabled ();
Dr. DS
35

Anda dapat menggunakan kode ini untuk mengarahkan pengguna ke Pengaturan, tempat mereka dapat mengaktifkan 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
sumber
1
Terima kasih banyak, tetapi saya tidak perlu kode untuk memeriksa GPS tetapi hanya layanan lokasi.
Meroelyth
1
layanan lokasi selalu tersedia, tetapi penyedia yang berbeda mungkin tidak tersedia.
lenik
4
@lenik, beberapa perangkat menyediakan pengaturan (di bawah "Pengaturan> Pribadi> Layanan lokasi> Akses ke lokasi saya") yang tampaknya mengaktifkan / menonaktifkan deteksi lokasi sama sekali, bahkan jika penyedia tertentu diaktifkan. Saya melihat ini secara langsung dengan ponsel yang saya uji, dan meskipun Wifi dan GPS diaktifkan, keduanya tampak mati ... di aplikasi saya. Sayangnya, saya sejak mengaktifkan pengaturan dan tidak dapat lagi mereproduksi skenario asli, bahkan ketika menonaktifkan pengaturan "Akses ke lokasi saya". Jadi saya tidak bisa mengatakan apakah pengaturan itu memengaruhi isProviderEnabled()dan getProviders(true)metode.
The Awnry Bear
... Saya hanya ingin membuang itu di sana kalau-kalau ada orang lain mengalami masalah yang sama. Saya belum pernah melihat pengaturan sebelumnya pada perangkat lain yang telah saya uji. Tampaknya menjadi semacam switch mematikan deteksi lokasi-sistem. Jika ada yang punya pengalaman tentang bagaimana isProviderEnabled()dan getProviders(true)metode merespons ketika pengaturan seperti itu diaktifkan (atau dinonaktifkan, tergantung pada bagaimana Anda melihatnya), saya akan sangat ingin tahu apa yang Anda temui.
The Awnry Bear
25

Bermigrasi ke Android X dan gunakan

implementation 'androidx.appcompat:appcompat:1.1.0'

dan gunakan LocationManagerCompat

Di jawa

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

Di Kotlin

private fun isLocationEnabled(context: Context): Boolean {
    val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    return LocationManagerCompat.isLocationEnabled(locationManager)
}
Cerah
sumber
Ini berfungsi untuk semua Versi Android sejak Android 1.0. Tetapi perhatikan Before API version LOLLIPOP [API Level 21], this method would throw SecurityException if the location permissions were not sufficient to use the specified provider.Jadi, jika Anda tidak memiliki izin untuk jaringan atau penyedia gps, itu mungkin melemparkan pengecualian, tergantung yang diaktifkan. Periksa kode sumber untuk info lebih lanjut.
xuiqzy
15

Dengan menonaktifkan jawaban di atas, di API 23 Anda perlu menambahkan pemeriksaan izin "berbahaya" serta memeriksa sistemnya sendiri:

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
sumber
Tidak dapat menyelesaikan simbol Manifest.permission.ACCESS_COARSE_LOCATION dan Manifest.permission.ACCESS_FINE_LOCATION
Gennady Kozlov
Gunakan android.Manifest.permission.ACCESS_FINE_LOCATION
aLIEz
7

Jika tidak ada penyedia yang diaktifkan, "pasif" adalah penyedia terbaik yang dikembalikan. Lihat 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
sumber
7

Ya, Anda dapat memeriksa di bawah ini kodenya:

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

dengan izin di file manifes:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Arun kumar
sumber
6

Ini jika klausa dengan mudah memeriksa apakah layanan lokasi tersedia menurut saya:

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

}
tsemann
sumber
4

Saya menggunakan cara seperti itu untuk NETWORK_PROVIDER tetapi Anda dapat menambahkan dan untuk GPS .

LocationManager locationManager;

Di onCreate saya masukkan

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

Dan metode pengecekan

protected boolean isLocationEnabled(){
    String le = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) getSystemService(le);
    if(!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        return false;
    } else {
        return true;
    }
}
P. Dm
sumber
2
Anda tidak perlu jika-kalau-begitu, Anda bisa kembalilocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
LadyWoodi
4

Ini adalah metode yang sangat berguna yang mengembalikan " true" jika Location servicesdiaktifkan:

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
sumber
3

Untuk mendapatkan lokasi Geo saat ini di peta google android, Anda harus mengaktifkan opsi lokasi perangkat Anda . Untuk memeriksa apakah lokasi itu aktif atau tidak, Anda dapat memanggil metode ini dari onCreate()metode Anda .

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
sumber
3

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

dialog

private fun showLocationIsDisabledAlert() {
    alert("We can't show your position because you generally disabled the location service for your device.") {
        yesButton {
        }
        neutralPressed("Settings") {
            startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
        }
    }.show()
}

sebut seperti ini

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

Petunjuk: dialog membutuhkan impor berikut (studio android harus menangani ini untuk Anda)

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

Dan dalam manifes Anda memerlukan izin berikut

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

Anda dapat meminta pembaruan lokasi dan menampilkan dialog bersama, seperti GoogleMaps juga. Ini kodenya:

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

Jika Anda memerlukan info lebih lanjut, periksa kelas LocationRequest .

bendaf
sumber
Halo, saya telah berjuang sejak dua hari terakhir untuk mendapatkan lokasi pengguna saat ini. Saya membutuhkan lat panjang pengguna saat ini, saya tahu itu bisa dilakukan dengan menggunakan klien google api. Tetapi bagaimana mengintegrasikan izin marshmallow di dalamnya. Plus jika layanan lokasi pengguna dimatikan, cara mengaktifkannya. Bisakah kamu menolong?
Chetna
Hai! Anda memiliki banyak pertanyaan, apa yang tidak bisa saya jawab dalam komentar. Tolong ajukan pertanyaan baru sehingga saya bisa menjawabnya lebih resmi!
bendaf
Saya telah mengirimkan pertanyaan saya di sini: stackoverflow.com/questions/39327480/…
Chetna
2

saya menggunakan kode pertama mulai membuat metode 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;
        }
    }

dan saya memeriksa Kondisi jika mendatang Buka peta dan salah memberikan niat 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();
    }

masukkan deskripsi gambar di sini

Pong Petrung
sumber
1

Dapat melakukannya dengan cara paling sederhana

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;
}
Vinayak
sumber
1

Jika Anda menggunakan AndroidX, gunakan kode di bawah ini untuk memeriksa Layanan Lokasi diaktifkan atau tidak:

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

Untuk memeriksa penyedia jaringan, Anda hanya perlu mengubah string yang diteruskan ke isProviderEnabled ke LocationManager.NETWORK_PROVIDER jika Anda memeriksa nilai pengembalian untuk penyedia GPS dan penyedia NETwork - keduanya salah berarti tidak ada layanan lokasi

hehe
sumber
0
private boolean isGpsEnabled()
{
    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    return service.isProviderEnabled(LocationManager.GPS_PROVIDER)&&service.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
Rahul
sumber
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();
    }
Adarsh ​​D
sumber
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";
    }
}

}

Gunakan metode isLocationEnabled untuk mendeteksi layanan lokasi diaktifkan.

https://github.com/Polidea/RxAndroidBle/issues/327# halaman akan memberikan informasi lebih lanjut mengapa tidak menggunakan penyedia pasif, alih-alih menggunakan mode lokasi.

alperk01
sumber