จะตรวจสอบได้อย่างไรว่าเปิดใช้งานบริการตำแหน่งแล้ว


228

ฉันกำลังพัฒนาแอพบน Android OS ฉันไม่ทราบวิธีตรวจสอบว่าบริการตำแหน่งเปิดใช้งานอยู่หรือไม่

ฉันต้องการวิธีที่ส่งกลับ "true" หากเปิดใช้งานและ "false" หากไม่ใช่ (ดังนั้นในกรณีสุดท้ายฉันสามารถแสดงกล่องโต้ตอบเพื่อเปิดใช้งานได้)


3
ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่สำหรับผู้ที่อาจติดตาม ... Google ได้เปิดตัว API สำหรับสิ่งนี้ ดูdevelopers.google.com/android/reference/com/google/android/gms/…
Peter McLennan


FYI: การตั้งค่า Api เลิกใช้แล้วในตอนนี้ ใช้developers.google.com/android/reference/com/google/android/gms/…แทน
Rajiv

คำตอบ:


361

คุณสามารถใช้รหัสด้านล่างเพื่อตรวจสอบว่าผู้ให้บริการจีพีเอสและผู้ให้บริการเครือข่ายเปิดใช้งานหรือไม่

LocationManager lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
boolean gps_enabled = false;
boolean network_enabled = false;

try {
    gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {}

try {
    network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {}

if(!gps_enabled && !network_enabled) {
    // notify user
    new AlertDialog.Builder(context)
        .setMessage(R.string.gps_network_not_enabled)
        .setPositiveButton(R.string.open_location_settings, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
            }
        }
        .setNegativeButton(R.string.Cancel,null)
        .show();    
}

และในไฟล์รายการคุณจะต้องเพิ่มการอนุญาตต่อไปนี้

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

ขอบคุณสำหรับรหัส กำลังตรวจหาตัวจัดการตำแหน่ง: lm.getAllProviders().contains(LocationManager.GPS_PROVIDER)(หรือNETWORK_PROVIDER) จะทำให้แน่ใจว่าคุณจะไม่โยนผู้ใช้ไปยังหน้าการตั้งค่าที่ไม่มีตัวเลือกเครือข่าย
Petter

26
Settings.ACTION_SECURITY_SETTINGSควร:Settings.ACTION_LOCATION_SOURCE_SETTINGS
petter

2
คุณสามารถตรวจสอบเพื่อดูว่าโทรศัพท์อยู่ในโหมดเครื่องบินและจัดการกับมัน .... stackoverflow.com/questions/4319212/...
จอห์น

2
ฉันมีปัญหาบางอย่างกับ lm.isProviderEnabled (LocationManager.GPS_PROVIDER) ซึ่งใช้เพื่อส่งคืน false เสมอ สิ่งนี้ดูเหมือนว่าจะเกิดขึ้นเมื่อคุณใช้ Play Services เวอร์ชั่นใหม่: เป็นเวอร์ชั่นที่แสดงข้อความโต้ตอบที่คุณสามารถเปิด gps ของคุณได้จากกล่องโต้ตอบโดยไม่แสดงกิจกรรมการตั้งค่า เมื่อผู้ใช้เปลี่ยนจีพีเอสจากกล่องโต้ตอบนั้นคำสั่งนั้นจะส่งคืนเท็จเสมอแม้ในขณะที่ gps เปิดอยู่
Marcelo Noguti

7
นอกจากนี้ไม่ควรปล่อยว่างบล็อกลองใช้ที่สับสนและไร้ประโยชน์
Chisko

225

ฉันใช้รหัสนี้เพื่อตรวจสอบ:

public static boolean isLocationEnabled(Context context) {
    int locationMode = 0;
    String locationProviders;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);

        } catch (SettingNotFoundException e) {
            e.printStackTrace();
            return false;
        }

        return locationMode != Settings.Secure.LOCATION_MODE_OFF;

    }else{
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        return !TextUtils.isEmpty(locationProviders);
    }


} 

7
เพื่อความชัดเจนอาจต้องการส่งคืน false ใน catch block เลือกตำแหน่งเริ่มต้นเป็น Settings.Secure.LOCATION_MODE_OFF
RyanLeonard

2
นี่เป็นคำตอบที่ดีเพราะใช้ได้กับ API ตำแหน่ง Android ทั้งเก่าและใหม่
Diederik

2
LOCATION_PROVIDERS_ALLOWED - การเชื่อมโยงอย่างต่อเนื่องนี้ได้รับการคัดค้านในระดับ API 19. เราต้องใช้ LOCATION_MODE และ MODE_CHANGED_ACTION (หรือ PROVIDERS_CHANGED_ACTION)
Choletski

3
คำตอบนี้ควรได้รับการยอมรับว่าเป็นคำตอบที่ถูกต้อง locationManager.isProviderEnabled () วิธีการไม่น่าเชื่อถือในอุปกรณ์ 4.4 ของฉัน (และฉันเห็นนักพัฒนาคนอื่นมีปัญหาเดียวกันกับระบบปฏิบัติการรุ่นอื่น ๆ ด้วย) ในกรณีของฉันมันจะคืนค่าจริงสำหรับ GPS ในแต่ละกรณี (ไม่สำคัญว่าบริการตำแหน่งจะเปิดใช้งานหรือไม่) ขอบคุณสำหรับทางออกที่ยอดเยี่ยมนี้!
strongmayer

2
นี่ไม่ทำงานบนอุปกรณ์ทดสอบของฉัน Samsung SHV-E160K, android 4.1.2, API 16 แม้ว่าฉันจะทำให้ GPS ออฟไลน์แล้วฟังก์ชันนี้ยังคงกลับมาจริง ฉันทดสอบบน Android Nougat, API 7.1 ใช้งานได้
HendraWD

38

ดังเช่นในปี 2020

ใหม่ล่าสุดวิธีที่ดีที่สุดและสั้นที่สุดคือ

public static Boolean isLocationEnabled(Context context)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// This is new method provided in API 28
            LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            return lm.isLocationEnabled();
        } else {
// This is Deprecated in API 28
            int mode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
                    Settings.Secure.LOCATION_MODE_OFF);
            return  (mode != Settings.Secure.LOCATION_MODE_OFF);

        }
    }

1
ยอดเยี่ยม! แต่ยังดีกว่าไม่ได้รับการกำจัดหล่อและผ่านโดยตรงLocationManager.classในgetSystemServiceวิธีการเพราะต้องโทร API 23 ;-)
Mackovich

6
หรือคุณสามารถใช้LocationManagerCompatแทน :)
Mokkun

ใช้ return lm! = null && lm.isLocationEnabled (); แทนการส่งคืน lm.isLocationEnabled ();
ดร. DS

35

คุณสามารถใช้รหัสนี้เพื่อนำผู้ใช้ไปยังการตั้งค่าซึ่งพวกเขาสามารถเปิดใช้งาน GPS:

    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    if( !locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ) {
        new AlertDialog.Builder(context)
            .setTitle(R.string.gps_not_found_title)  // GPS not found
            .setMessage(R.string.gps_not_found_message) // Want to enable?
            .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int i) {
                    owner.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                }
            })
            .setNegativeButton(R.string.no, null)
            .show();
    }

1
ขอบคุณมาก แต่ฉันไม่ต้องการรหัสเพื่อตรวจสอบ GPS แต่เป็นเพียงบริการระบุตำแหน่ง
Meroelyth

1
บริการระบุตำแหน่งมีให้บริการเสมอ แต่ผู้ให้บริการรายอื่นอาจไม่พร้อมใช้งาน
lenik

4
@lenik อุปกรณ์บางตัวมีการตั้งค่า (ภายใต้ "การตั้งค่า> ส่วนบุคคล> บริการตำแหน่ง> การเข้าถึงตำแหน่งของฉัน") ซึ่งดูเหมือนว่าจะเปิด / ปิดการใช้งานการตรวจจับตำแหน่งโดยรวมแม้ว่าผู้ให้บริการเฉพาะจะเปิดใช้งานก็ตาม ฉันเห็นมือแรกนี้ด้วยโทรศัพท์ที่ฉันทดสอบด้วยและถึงแม้จะเปิดใช้งานทั้ง Wifi และ GPS พวกเขาก็ดูเหมือนจะตาย ... ไปยังแอปของฉัน น่าเสียดายที่ฉันเปิดใช้งานการตั้งค่าและไม่สามารถสร้างสถานการณ์เดิมได้อีกต่อไปแม้ว่าจะปิดใช้งานการตั้งค่า "การเข้าถึงตำแหน่งของฉัน" ดังนั้นฉันไม่สามารถพูดได้ว่าการตั้งค่านั้นมีผลต่อisProviderEnabled()และgetProviders(true)วิธีการหรือไม่
Awnry Bear

... ฉันแค่อยากจะโยนมันออกไปในกรณีที่คนอื่นวิ่งเข้าไปในประเด็นเดียวกัน ฉันไม่เคยเห็นการตั้งค่ามาก่อนบนอุปกรณ์อื่น ๆ ที่ฉันทดสอบด้วย ดูเหมือนว่าจะเป็นสวิตช์ฆ่าตำแหน่งตรวจจับทั่วทั้งระบบ หากใครมีประสบการณ์เกี่ยวกับวิธีการisProviderEnabled()และgetProviders(true)วิธีการตอบสนองเมื่อเปิดใช้งานการตั้งค่า (หรือปิดการใช้งานขึ้นอยู่กับว่าคุณดูมัน) ฉันอยากรู้ว่าคุณพบสิ่งใด
Awnry Bear

25

โอนย้ายเป็น Android X และใช้

implementation 'androidx.appcompat:appcompat:1.1.0'

และใช้ LocationManagerCompat

ในภาษาจาวา

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

ในคอตลิน

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

ใช้ได้กับ Android ทุกรุ่นตั้งแต่ Android 1.0 แต่ทราบBefore API version LOLLIPOP [API Level 21], this method would throw SecurityException if the location permissions were not sufficient to use the specified provider.ดังนั้นหากคุณไม่ได้รับอนุญาตสำหรับเครือข่ายหรือผู้ให้บริการจีพีเอสมันอาจโยนข้อยกเว้นขึ้นอยู่กับการเปิดใช้งาน ตรวจสอบซอร์สโค้ดสำหรับข้อมูลเพิ่มเติม
xuiqzy

15

ทำงานนอกคำตอบข้างต้นใน API 23 คุณต้องเพิ่มการตรวจสอบสิทธิ์ "อันตราย" รวมถึงการตรวจสอบระบบเอง:

public static boolean isLocationServicesAvailable(Context context) {
    int locationMode = 0;
    String locationProviders;
    boolean isAvailable = false;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }

        isAvailable = (locationMode != Settings.Secure.LOCATION_MODE_OFF);
    } else {
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        isAvailable = !TextUtils.isEmpty(locationProviders);
    }

    boolean coarsePermissionCheck = (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
    boolean finePermissionCheck = (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);

    return isAvailable && (coarsePermissionCheck || finePermissionCheck);
}

ไม่สามารถแก้ไขสัญลักษณ์ Manifest.permission.EXE_COARSE_LOCATION และ Manifest.permission.EXT_FIN_LOCATION
Gennady Kozlov

ใช้ android.Manifest.permission.ACCESS_FINE_LOCATION
aLIEz

7

หากไม่มีการเปิดใช้งานผู้ให้บริการ "แฝง" เป็นผู้ให้บริการที่ดีที่สุดที่ส่งคืน ดูhttps://stackoverflow.com/a/4519414/621690

    public boolean isLocationServiceEnabled() {
        LocationManager lm = (LocationManager)
                this.getSystemService(Context.LOCATION_SERVICE);
        String provider = lm.getBestProvider(new Criteria(), true);
        return (StringUtils.isNotBlank(provider) &&
                !LocationManager.PASSIVE_PROVIDER.equals(provider));
    }

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

}

4

ผมใช้วิธีการดังกล่าวสำหรับNETWORK_PROVIDERแต่คุณสามารถเพิ่มและจีพีเอส

LocationManager locationManager;

ในonCreateฉันใส่

   isLocationEnabled();
   if(!isLocationEnabled()) {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle(R.string.network_not_enabled)
                .setMessage(R.string.open_location_settings)
                .setPositiveButton(R.string.yes,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                            }
                        })
                .setNegativeButton(R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alert = builder.create();
        alert.show();
    } 

และวิธีการตรวจสอบ

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

2
คุณไม่ต้องการถ้าอย่างอื่นคุณสามารถคืนได้locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
LadyWoodi

4

นี่เป็นวิธีที่มีประโยชน์มากที่จะคืนค่า " true" ถ้าLocation servicesเปิดใช้งาน:

public static boolean locationServicesEnabled(Context context) {
        LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean gps_enabled = false;
        boolean net_enabled = false;

        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
            Log.e(TAG,"Exception gps_enabled");
        }

        try {
            net_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
            Log.e(TAG,"Exception network_enabled");
        }
        return gps_enabled || net_enabled;
}

3

ในการรับตำแหน่งทางภูมิศาสตร์ปัจจุบันใน android google maps คุณควรเปิดตัวเลือกที่ตั้งอุปกรณ์ของคุณเพื่อตรวจสอบว่าสถานที่นั้นเปิดอยู่หรือไม่คุณสามารถโทรหาวิธีนี้ได้ง่ายๆจาก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();
    }
}

3

สำหรับ 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)
 }

โต้ตอบ

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

2

คุณสามารถขออัปเดตตำแหน่งและแสดงข้อความโต้ตอบด้วยกันเช่น GoogleMaps doas นี่คือรหัส:

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


สวัสดีฉันพยายามอย่างหนักตั้งแต่สองวันที่ผ่านมาเพื่อรับตำแหน่งปัจจุบันของผู้ใช้ ฉันต้องการ lat lat ปัจจุบันของผู้ใช้ฉันรู้ว่าสามารถทำได้โดยใช้ไคลเอ็นต์ Google api แต่วิธีการรวมสิทธิ์ marshmallow ในนั้น นอกจากนี้หากเปิดบริการตำแหน่งของผู้ใช้จะเปิดใช้งานได้อย่างไร คุณช่วยได้ไหม
Chetna

Hi! คุณมีคำถามมากมายสิ่งที่ฉันไม่สามารถตอบได้ในความคิดเห็น โปรดถามคำถามใหม่เพื่อที่ฉันจะได้ตอบอย่างเป็นทางการมากขึ้น!
bendaf

ฉันได้โพสต์คำถามของฉันที่นี่: stackoverflow.com/questions/39327480/…
Chetna

2

ฉันใช้รหัสแรกเริ่มต้นสร้างวิธี isLocationEnabled

 private LocationManager locationManager ;

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

และฉันตรวจสอบเงื่อนไขว่า ture เปิดแผนที่และให้ความตั้งใจเป็นเท็จ ACTION_LOCATION_SOURCE_SETTINGS

    if (isLocationEnabled()) {
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        locationClient = getFusedLocationProviderClient(this);
        locationClient.getLastLocation()
                .addOnSuccessListener(new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        // GPS location can be null if GPS is switched off
                        if (location != null) {
                            onLocationChanged(location);

                            Log.e("location", String.valueOf(location.getLongitude()));
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e("MapDemoActivity", e.toString());
                        e.printStackTrace();
                    }
                });


        startLocationUpdates();

    }
    else {
        new AlertDialog.Builder(this)
                .setTitle("Please activate location")
                .setMessage("Click ok to goto settings else exit.")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        startActivity(intent);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        System.exit(0);
                    }
                })
                .show();
    }

ป้อนคำอธิบายรูปภาพที่นี่


1

สามารถทำได้ในวิธีที่ง่ายที่สุด

private boolean isLocationEnabled(Context context){
int mode =Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
                        Settings.Secure.LOCATION_MODE_OFF);
                final boolean enabled = (mode != android.provider.Settings.Secure.LOCATION_MODE_OFF);
return enabled;
}

1

หากคุณใช้ AndroidX ให้ใช้รหัสด้านล่างเพื่อตรวจสอบว่าเปิดใช้บริการตำแหน่งหรือไม่:

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

0

ในการตรวจสอบผู้ให้บริการเครือข่ายคุณเพียงแค่เปลี่ยนสตริงที่ส่งผ่านไปยัง isProviderEnabled เป็น LocationManager.NETWORK_PROVIDER หากคุณตรวจสอบค่าส่งคืนสำหรับทั้งผู้ให้บริการ GPS และผู้ให้บริการเครือข่าย - ทั้งเท็จหมายความว่าไม่มีบริการระบุตำแหน่ง


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

0
    LocationManager lm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
    boolean gps_enabled = false;
    boolean network_enabled = false;

    try {
        gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch(Exception e){
         e.printStackTrace();
    }

    try {
        network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch(Exception e){
         e.printStackTrace();
    }

    if(!gps_enabled && !network_enabled) {
        // notify user
        new AlertDialog.Builder(this)
                .setMessage("Please turn on Location to continue")
                .setPositiveButton("Open Location Settings", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }

                }).
                setNegativeButton("Cancel",null)
                .show();
    }

0
public class LocationUtil {
private static final String TAG = LocationUtil.class.getSimpleName();

public static LocationManager getLocationManager(final Context context) {
    return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}

public static boolean isNetworkProviderEnabled(final Context context) {
    return getLocationManager(context).isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

public static boolean isGpsProviderEnabled(final Context context) {
    return getLocationManager(context).isProviderEnabled(LocationManager.GPS_PROVIDER);
}

// Returns true even if the location services are disabled. Do not use this method to detect location services are enabled.
private static boolean isPassiveProviderEnabled(final Context context) {
    return getLocationManager(context).isProviderEnabled(LocationManager.PASSIVE_PROVIDER);
}

public static boolean isLocationModeOn(final Context context) throws Exception {
    int locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
    return locationMode != Settings.Secure.LOCATION_MODE_OFF;
}

public static boolean isLocationEnabled(final Context context) {
    try {
        return isNetworkProviderEnabled(context) || isGpsProviderEnabled(context)  || isLocationModeOn(context);
    } catch (Exception e) {
        Log.e(TAG, "[isLocationEnabled] error:", e);
    }
    return false;
}

public static void gotoLocationSettings(final Activity activity, final int requestCode) {
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    activity.startActivityForResult(intent, requestCode);
}

public static String getEnabledProvidersLogMessage(final Context context){
    try{
        return "[getEnabledProvidersLogMessage] isNetworkProviderEnabled:"+isNetworkProviderEnabled(context) +
                ", isGpsProviderEnabled:" + isGpsProviderEnabled(context) +
                ", isLocationModeOn:" + isLocationModeOn(context) +
                ", isPassiveProviderEnabled(ignored):" + isPassiveProviderEnabled(context);
    }catch (Exception e){
        Log.e(TAG, "[getEnabledProvidersLogMessage] error:", e);
        return "provider error";
    }
}

}

ใช้วิธี isLocationEnabled เพื่อตรวจสอบว่ามีการเปิดใช้งานบริการระบุตำแหน่ง

https://github.com/Polidea/RxAndroidBle/issues/327#หน้าจะให้ข้อมูลเพิ่มเติมว่าทำไมไม่ใช้ผู้ให้บริการแฝงแทนที่จะใช้โหมดตำแหน่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.