【问题标题】:How to know if Location is enabled from settings for Android Application programmatically如何以编程方式知道是否从 Android 应用程序的设置中启用了位置
【发布时间】:2018-01-30 06:00:06
【问题描述】:

更新 2

我知道 SelfCheckPermission 可能会有所帮助或真正的答案,但问题是我找不到正确的关键字。

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

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

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

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

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


更新 1

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


原帖

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

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

CTTO - 来自 Google 的图片

【问题讨论】:

  • 很抱歉,这不是重复的。我将补充一个问题,这与位置服务无关,而是关于应用程序设置的位置权限
  • 对不起,如果不是重复的,谢谢
  • 在最后一张图片中,你选择,允许,然后操作系统将被允许工作
  • 是的,它会在您允许之后,我需要的是在我自己的应用程序中触发该行为的代码。如果从应用程序设置中禁用了权限,那么它将提示我需要允许该权限的消息(在我的情况下,它是位置权限)

标签: android xamarin xamarin.android android-permissions


【解决方案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) 在Manifest.Permission.LocationHardware 上执行RequestPermissions

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

VerifyPermissionsHelper 方法:

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

【讨论】:

  • 谢谢寿司!我试试看。
  • 很抱歉,!PermissionUtil 有什么?是你自己的方法吗?
  • @jace 很抱歉,剪切并粘贴我的代码,它只是一种循环遍历所有烫发结果的辅助方法(您可以请求不止一个检查,从而获得不止一个结果)。
  • 我正在使用 xamarin,所以我将您的代码从公共更改为受保护,但无论如何我怎样才能转到 OnRequestPermissionsResult?即使我已经在我的使用中包含了 v4,它也没有在我可以覆盖的方法上定义。触发 ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.LocationHardware }, 1);什么都没有发生
  • @jace ???我也是...将接口ActivityCompat.IOnRequestPermissionsResultCallback 添加到您的Activity 并实现OnRequestPermissionsResult 覆盖
【解决方案2】:

我希望这个方法能正常工作:

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

【讨论】:

  • 请重新阅读问题。这与 selfcheckpermission 无关,因为即使设置中的应用程序权限被禁用,它也总是被授予
  • 如果在设置-->应用-->你的应用-->权限中启用了位置权限,我分享的方法将返回true,如果禁用了位置,则返回false。我也阅读了更新的问题,但我仍然觉得您正在寻找这个。而且我真的不明白“这与 selfcheckpermission 无关,因为即使设置中的应用程序权限被禁用,它也总是被授予”是什么意思
  • 我试了一下,但即使启用了设置权限,它仍然是正确的。我也可以在您的代码中看到它,因为它正在检查 COARSE 权限,就像检查清单中的 FINE 位置一样,因此它不会真正解决问题。 COARSE 和 FINE 位置已经在清单中,这就是它以任何方式返回 true 的原因。
  • 也许我在这里缺少的是设置中位置的正确关键字。粗精定位无法触发
  • 我可以获得相机权限等,但我无法获得位置。如果我只能得到正确的关键字,也许你的答案会奏效。但现在我不能只通过粗略检查来使用它
【解决方案3】:

您可以使用下面的代码来检查是否启用了 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();      
}

【讨论】:

  • 请重新阅读问题。这与 selfcheckpermission 无关,因为即使设置中的应用程序权限被禁用,它也总是被授予
  • 所以你要检查位置是否启用..对吗?
  • 我更新了我的问题。请参考一下,谢谢:)
  • 代码已更新。请检查并告诉我。谢谢
  • 抱歉,这段代码和@Adnanul 所说的一样。我不需要检查位置服务,也不需要检查提供商的可用性。我需要的是申请许可。例如,如果您转到设置并查找应用程序/应用程序,然后转到相机应用程序。转到权限并禁用您的相机权限......因此,您将无法使用您的相机。这就是我需要的位置,而不是位置服务,也不是粗略和精细的位置权限。
猜你喜欢
  • 1970-01-01
  • 2020-04-27
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2015-11-08
  • 1970-01-01
  • 2020-12-03
相关资源
最近更新 更多