我正在尝试让用户使用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。
答案 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中的逐步调试器来查看代码中的确切内容。