Android Cordova运行时权限

Android Cordova运行时权限,android,cordova,permissions,Android,Cordova,Permissions,我试图让用户使用Cordova的hasPermission/requestPermission方法为我的应用程序启用位置组权限,但结果令人困惑 当我使用ACCESS\u FINE\u LOCATION调用hasPermission时,它总是返回true。在Manifest.permission\u group.LOCATION上调用此函数似乎会适当地返回true/false 使用Manifest.permission\u group.LOCATION调用requestPermission不会显示

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

当我使用ACCESS\u FINE\u LOCATION调用hasPermission时,它总是返回true。在Manifest.permission\u group.LOCATION上调用此函数似乎会适当地返回true/false

使用Manifest.permission\u group.LOCATION调用requestPermission不会显示系统对话框,因此我使用ACCESS\u FINE\u LOCATION调用它来获取对话框

对话框“允许”按钮打开“我的应用”的位置组权限,并在授予PackageManager.permission_的情况下调用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);
} 
正确的处理方法是什么?有时使用个人权限,有时使用组和这些方法似乎不正确-我希望这是一致的。我的猜测是,在对话框上按下拒绝按钮后授予的权限是因为我正在请求个人权限,即使组处于关闭状态,该权限仍处于打开状态;有没有办法检测到用户拒绝了请求

我有很多问题,基本上可以归结为“我如何让用户在位置组权限关闭时启用它,或者知道他们何时拒绝”

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

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

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

但是,如果您的应用程序显示运行时权限对话框,我猜您一定是在根据API 23构建并使用
cordova-android@5+
适用于Android平台

关于权限组与个人权限,您应该阅读:

系统显示的对话框描述了应用程序需要访问的权限组;它没有列出特定的权限。例如,如果您请求READ_CONTACTS权限,系统对话框只会说您的应用程序需要访问设备的联系人。用户只需为每个权限组授予一次权限。如果您的应用程序请求该组中的任何其他权限(在应用程序清单中列出),系统将自动授予这些权限。当您请求权限时,系统调用onRequestPermissionsResult()回调方法并传递已授予的权限,与用户通过系统对话框显式授予您的请求的方式相同

因此,在您的情况下,请求
ACCESS\u FINE\u LOCATION
将授予对
LOCATION
组中所有权限的访问权(您可以找到组和权限的完整列表)

“拒绝”按钮还返回…已授予,关闭位置组权限


这不应该被授予。如果按下拒绝按钮,将拒绝对整个权限组(包括请求的权限)的访问。代码片段中的逻辑看起来可以处理这个问题,因此我将使用Android Studio中的逐步调试程序来查看您的代码中到底发生了什么。

我怀疑Deny按钮允许的返回是因为它为ACCESS\u FINE\u位置返回API 22值true。