Android Cordova运行时权限
我试图让用户使用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,但“拒绝”按钮也会返回…已授予,从而关闭位置组权限 为便于说明,以下是我当前的代码: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不会显示
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。