Android OS에서 앱을 개발 중입니다. 위치 서비스가 활성화되어 있는지 확인하는 방법을 모르겠습니다.
활성화 된 경우 "true"를 반환하고 그렇지 않은 경우 "false"를 반환하는 메서드가 필요합니다 (마지막 경우 활성화 할 수있는 대화 상자를 표시 할 수 있음).
Android OS에서 앱을 개발 중입니다. 위치 서비스가 활성화되어 있는지 확인하는 방법을 모르겠습니다.
활성화 된 경우 "true"를 반환하고 그렇지 않은 경우 "false"를 반환하는 메서드가 필요합니다 (마지막 경우 활성화 할 수있는 대화 상자를 표시 할 수 있음).
답변:
아래 코드를 사용하여 gps 공급자와 네트워크 공급자가 활성화되어 있는지 확인할 수 있습니다.
LocationManager lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
boolean gps_enabled = false;
boolean network_enabled = false;
try {
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {}
try {
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {}
if(!gps_enabled && !network_enabled) {
// notify user
new AlertDialog.Builder(context)
.setMessage(R.string.gps_network_not_enabled)
.setPositiveButton(R.string.open_location_settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
}
.setNegativeButton(R.string.Cancel,null)
.show();
}
그리고 매니페스트 파일에서 다음 권한을 추가해야합니다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
lm.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
메소드를 직접 전달하는 것 입니다. ;-)
이 코드를 사용하여 사용자를 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.
네트워크 나 gps 제공자에 대한 권한이없는 경우 활성화 된 네트워크에 따라 예외가 발생할 수 있습니다. 자세한 정보는 소스 코드를 확인하십시오.
위의 답변을 해결하려면 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" />
이 if 절은 내 의견으로는 위치 서비스가 있는지 쉽게 확인합니다.
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에 이러한 방식을 사용 하지만 GPS를 추가하고 추가 할 수 있습니다 .
LocationManager locationManager;
에서 에서 onCreate I 넣어
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;
}
안드로이드 구글지도에서 현재 지리적 위치 를 얻으 려면 장치 위치 옵션을 켜야 합니다. 위치가 켜져 있는지 여부를 확인하려면 메소드 에서이 메소드를 간단하게 호출 할 수 있습니다 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();
}
}
코 틀린
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 if ture if if map을 열고 false 의도 의도 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;
}
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# 페이지에서 수동 공급자를 사용하지 않는 대신 위치 모드를 사용하는 이유에 대한 자세한 정보를 제공합니다.