如何以编程方式从Android应用程序的设置中了解是否启用了位置

时间:2018-01-30 06:00:07

标签: android xamarin xamarin.android android-permissions

更新2

我理解SelfCheckPermission可能有帮助或真正的答案,但问题是我无法找到合适的关键字。

如果是相机,我只需要这个代码

if(CheckSelfPermission(Manifest.Permission.Camera)
                == Permission.Granted)

如果是读取联系人等其他内容,我可以使用此代码。

if(CheckSelfPermission(Manifest.Permission.ReadContacts)
                == Permission.Granted)

但我无法使用AccessCoarseLocation和AccessFineLocation在应用程序设置中启用位置,因为即使我在应用程序的应用程序设置中禁用了位置,它们仍然都是正确的。也许我只需要一个正确的关键字,以及我需要你帮助的地方。

更新1

位置服务不是我在这里的意思。位置服务,粗略和精细位置权限可以启用或禁用,与应用程序设置上的位置应用程序权限无关。我需要的是从设置中检查应用程序设置 - > apps / applition - >你的应用 - >如果位置被禁用,则位置。示例应用程序是此Waze已禁用位置

enter image description here enter image description here

原始帖子

我搜索的所有内容都是自行检查粗略和精细位置的权限,但它并不能解决我的问题,因为即使禁用了应用程序设置的位置,它也始终被授予。我需要检测是否允许应用程序设置的位置。

我现在所拥有的是重定向到应用设置以允许所需的权限。 TIA。

enter image description here CTTO - 来自谷歌的图片

3 个答案:

答案 0 :(得分:1)

使用Android.Support.V4.App,您可以请求权限(Manifest.Permission.LocationHardware)并查看OnRequestPermissionsResult中的结果,以确定用户是否已手动禁用权限(或在系统对话框出现时拒绝权限) )。

1)实施ActivityCompat.IOnRequestPermissionsResultCallback

public override void OnRequestPermissionsResult (int requestCode, string[] permissions, Permission[] grantResults)
{
    if (requestCode == REQUEST_LOCATION) {
        Log.Info (TAG, "Received response for location permissions request.");

        if (!PermissionUtil.VerifyPermissions (grantResults)) {
            Log.Info (TAG, "Location permissions are NOT granted.");
            Snackbar.Make (layout, Resource.String.permissions_not_granted, Snackbar.LengthShort).Show ();
        }
    }
}

2)在RequestPermissions上执行Manifest.Permission.LocationHardware

ActivityCompat.RequestPermissions (this, new string[] {Manifest.Permission.LocationHardware}, REQUEST_LOCATION);

VerifyPermissions助手方法:

public static bool VerifyPermissions (Permission[] grantResults)
{
    // At least one result must be checked.
    if (grantResults.Length < 1)
        return false;

    // Verify that each required permission has been granted, otherwise return false.
    foreach (Permission result in grantResults) {
        if (result != Permission.Granted) {
            return false;
        }
    }
    return true;
}

答案 1 :(得分:0)

我希望这种方法能够正常运作:

protected boolean isLocationPermissionEnabled() {
    return (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED);
}

答案 2 :(得分:-1)

您可以使用以下代码检查是否启用了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
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setMessage(context.getResources().getString(R.string.gps_network_not_enabled));
dialog.setPositiveButton(context.getResources().getString(R.string.open_location_settings), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface paramDialogInterface, int paramInt) {
            // TODO Auto-generated method stub
            Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            context.startActivity(myIntent);
            //get gps
        }
    });
dialog.setNegativeButton(context.getString(R.string.Cancel), new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface paramDialogInterface, int paramInt) {
            // TODO Auto-generated method stub

        }
    });
dialog.show();      
}