Cordova运行时权限

时间:2016-06-20 21:17:45

标签: android cordova permissions

我正在尝试让用户使用Cordova的hasPermission / requestPermission方法为我的应用启用位置组权限,但结果令人困惑......

当我使用ACCESS_FINE_LOCATION调用hasPermission时,它总是返回true。在Manifest.permission_group.LOCATION上调用它似乎适当地返回true / false。

使用Manifest.permission_group.LOCATION调用requestPermission不会显示系统对话框,所以我使用ACCESS_FINE_LOCATION调用它来获取对话框。

对话框“允许”按钮打开我的应用程序的“位置”组权限,并使用PackageManager.PERMISSION_GRANTED调用onRequestPermissionResult,但“拒绝”按钮也返回...已授予,关闭“位置”组权限。

为了说明,这是我目前的代码:

private void checkPermissions() {
    if (!cordova.hasPermission(Manifest.permission_group.LOCATION)) {
        cordova.requestPermission(this, PERMISSION_RUNTIME_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION);
    }
}

@Override
public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException {
    if (permissions.length != 1 || grantResults.length != 1 || !Manifest.permission.ACCESS_FINE_LOCATION.equals(permissions[0])) {
        throw new RuntimeException("Unexpected permission results " + Arrays.toString(permissions) + ", " + Arrays.toString(grantResults));
    }
    int result = grantResults[0];
    String action = null;
    switch (result) {
        case PackageManager.PERMISSION_DENIED:
            action = Constants.ACTION_RUNTIME_PERMISSION_DENIED;
            break;
        case PackageManager.PERMISSION_GRANTED:
            action = Constants.ACTION_RUNTIME_PERMISSION_GRANTED;
            break;
        default:
            throw new RuntimeException("Unexpected permission result int " + result);
    }

    Intent i = new Intent(action);
    i.putExtra("permission", Constants.EXTRA_RUNTIME_PERMISSION_NOTIFICATION_ID);
    getContext().sendBroadcast(i);
} 

处理此问题的正确方法是什么?有时使用个人权限,有时使用这些方法的组似乎不对 - 我希望这是一致的。我的猜测是,在对话框上按下DENY按钮后的PERMISSION_GRANTED是因为我正在请求个人权限,即使群组已关闭,该权限也会启用;有没有办法检测用户是否拒绝了请求?

我在那里有很多问题,基本上归结为“我如何让用户在关闭时启用位置组权限或知道何时拒绝”?

如果有帮助,我的android-targetSdkVersion设置为22,我正在使用Cordova 6.1.1。

1 个答案:

答案 0 :(得分:1)

  

如果有帮助,我的android-targetSdkVersion设置为22,我使用Cordova 6.1.1。

Android运行时权限仅在API 23 中引入,因此如果您的android-targetSdkVersion设置为 22 ,则运行时权限代码将始终返回GRANTED任何权限,因为权限是在安装时通过清单授予的。

但是,如果您的应用 显示运行时权限对话框,我猜测您必须针对API 23构建并使用cordova-android@5+用于Android平台。

关于权限组与个人权限,您应该阅读Android documentation regarding runtime permissions

  

系统显示的对话框描述了您的应用需要访问的权限组;它没有列出具体的权限。例如,如果您请求READ_CONTACTS权限,系统对话框只会说您的应用需要访问设备的联系人。用户只需为每个权限组授予一次权限。如果您的应用请求该组中的任何其他权限(在您的应用清单中列出),系统会自动授予它们。当您请求权限时,系统会调用您的onRequestPermissionsResult()回调方法并传递PERMISSION_GRANTED,就像用户通过系统对话框明确授予您的请求一样。

因此,在您的情况下,请求ACCESS_FINE_LOCATION授予LOCATION组中所有权限的访问权限(您可以找到组和权限here的完整列表)。

  

拒绝按钮也会返回...已授予,关闭“位置”组权限。

这不应该返回GRANTED。如果按下“拒绝”按钮,则访问将被拒绝到整个权限组(包括请求的权限)。您的代码段中的逻辑看起来可以正常处理,因此我将使用Android Studio中的逐步调试器来查看代码中的确切内容。