ฉันกำลังพัฒนาแอพบน Android OS ฉันไม่ทราบวิธีตรวจสอบว่าบริการตำแหน่งเปิดใช้งานอยู่หรือไม่
ฉันต้องการวิธีที่ส่งกลับ "true" หากเปิดใช้งานและ "false" หากไม่ใช่ (ดังนั้นในกรณีสุดท้ายฉันสามารถแสดงกล่องโต้ตอบเพื่อเปิดใช้งานได้)
ฉันกำลังพัฒนาแอพบน Android OS ฉันไม่ทราบวิธีตรวจสอบว่าบริการตำแหน่งเปิดใช้งานอยู่หรือไม่
ฉันต้องการวิธีที่ส่งกลับ "true" หากเปิดใช้งานและ "false" หากไม่ใช่ (ดังนั้นในกรณีสุดท้ายฉันสามารถแสดงกล่องโต้ตอบเพื่อเปิดใช้งานได้)
คำตอบ:
คุณสามารถใช้รหัสด้านล่างเพื่อตรวจสอบว่าผู้ให้บริการจีพีเอสและผู้ให้บริการเครือข่ายเปิดใช้งานหรือไม่
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
) จะทำให้แน่ใจว่าคุณจะไม่โยนผู้ใช้ไปยังหน้าการตั้งค่าที่ไม่มีตัวเลือกเครือข่าย
Settings.ACTION_SECURITY_SETTINGS
ควร:Settings.ACTION_LOCATION_SOURCE_SETTINGS
ฉันใช้รหัสนี้เพื่อตรวจสอบ:
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);
}
}
ดังเช่นในปี 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);
}
}
LocationManager.class
ในgetSystemService
วิธีการเพราะต้องโทร API 23 ;-)
คุณสามารถใช้รหัสนี้เพื่อนำผู้ใช้ไปยังการตั้งค่าซึ่งพวกเขาสามารถเปิดใช้งาน GPS:
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if( !locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ) {
new AlertDialog.Builder(context)
.setTitle(R.string.gps_not_found_title) // GPS not found
.setMessage(R.string.gps_not_found_message) // Want to enable?
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i) {
owner.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton(R.string.no, null)
.show();
}
isProviderEnabled()
และgetProviders(true)
วิธีการหรือไม่
isProviderEnabled()
และgetProviders(true)
วิธีการตอบสนองเมื่อเปิดใช้งานการตั้งค่า (หรือปิดการใช้งานขึ้นอยู่กับว่าคุณดูมัน) ฉันอยากรู้ว่าคุณพบสิ่งใด
โอนย้ายเป็น 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)
}
Before API version LOLLIPOP [API Level 21], this method would throw SecurityException if the location permissions were not sufficient to use the specified provider.
ดังนั้นหากคุณไม่ได้รับอนุญาตสำหรับเครือข่ายหรือผู้ให้บริการจีพีเอสมันอาจโยนข้อยกเว้นขึ้นอยู่กับการเปิดใช้งาน ตรวจสอบซอร์สโค้ดสำหรับข้อมูลเพิ่มเติม
ทำงานนอกคำตอบข้างต้นใน 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);
}
หากไม่มีการเปิดใช้งานผู้ให้บริการ "แฝง" เป็นผู้ให้บริการที่ดีที่สุดที่ส่งคืน ดู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));
}
ใช่คุณสามารถตรวจสอบด้านล่างเป็นรหัส:
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" />
ถ้าข้อนี้ตรวจสอบได้ง่ายว่าบริการตำแหน่งมีอยู่ในความคิดของฉันหรือไม่:
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
//All location services are disabled
}
ผมใช้วิธีการดังกล่าวสำหรับ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;
}
}
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
นี่เป็นวิธีที่มีประโยชน์มากที่จะคืนค่า " 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;
}
ในการรับตำแหน่งทางภูมิศาสตร์ปัจจุบันใน 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();
}
}
สำหรับ 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"/>
คุณสามารถขออัปเดตตำแหน่งและแสดงข้อความโต้ตอบด้วยกันเช่น 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
ฉันใช้รหัสแรกเริ่มต้นสร้างวิธี 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();
}
สามารถทำได้ในวิธีที่ง่ายที่สุด
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;
}
หากคุณใช้ AndroidX ให้ใช้รหัสด้านล่างเพื่อตรวจสอบว่าเปิดใช้บริการตำแหน่งหรือไม่:
fun isNetworkServiceEnabled(context: Context) = LocationManagerCompat.isLocationEnabled(context.getSystemService(LocationManager::class.java))
ในการตรวจสอบผู้ให้บริการเครือข่ายคุณเพียงแค่เปลี่ยนสตริงที่ส่งผ่านไปยัง isProviderEnabled เป็น LocationManager.NETWORK_PROVIDER หากคุณตรวจสอบค่าส่งคืนสำหรับทั้งผู้ให้บริการ GPS และผู้ให้บริการเครือข่าย - ทั้งเท็จหมายความว่าไม่มีบริการระบุตำแหน่ง
private boolean isGpsEnabled()
{
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
return service.isProviderEnabled(LocationManager.GPS_PROVIDER)&&service.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
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();
}
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#หน้าจะให้ข้อมูลเพิ่มเติมว่าทำไมไม่ใช้ผู้ให้บริการแฝงแทนที่จะใช้โหมดตำแหน่ง