请求的 Android 权限未显示在应用程序权限设置中

Jas*_*sby 4 android cordova android-permissions

我正在开发一个需要权限INTERNETWRITE_EXTERNAL_STORAGEACCESS_WIFI_STATE和 的Cordova 应用程序CHANGE_WIFI_MULTICAST_STATE。我已在清单中请求这些权限,如下所示

<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
Run Code Online (Sandbox Code Playgroud)

INTERNETACCESS_WIFI_STATE、 和CHANGE_WIFI_MULTICAST_STATE被视为正常权限,根据文档,它们将在安装时被 Android 自动接受,并且用户无法撤销它们。

现在,在MainActivityCordova 创建的代码中,我在一个块中添加了以下代码if,用于检查以确保我们处于 6.0 或更高版本:

if (checkSelfPermission(Manifest.permission.ACCESS_WIFI_STATE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.CHANGE_WIFI_MULTICAST_STATE) == PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "has permission");
        }
        else {
            Log.d(TAG, "no permission");
            requestPermissions(new String[] { Manifest.permission.ACCESS_WIFI_STATE,
                    Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
        }
Run Code Online (Sandbox Code Playgroud)

问题是,在运行 5.1.1 的 Android 设备上,此方法有效,并且当我转到应用程序的权限设置时,我会看到所有 4 个权限。但是,在运行 7.0 和 7.1.1 的设备上,我收到一个对话框,要求批准WRITE_EXTERNAL_STORAGE和所有其他权限,因为它们是正常的,因此不会要求批准。它们会自动获得批准。问题是,即使我拥有权限,在较新的设备上我也无法执行与这些权限相关的操作,并且如果我进入应用程序设置获取权限,我看到的只是授予的权限存储。没有什么INTERNET,,ACCESS_WIFI_STATECHANGE_WIFI_MULTICAST_STATE。我没有专门在 6.0 设备上进行测试,但我想我也会遇到同样的问题。

为什么权限设置中没有显示权限,为什么我无法执行需要这些权限的操作,即使 Android 说我有权限?

0X0*_*gar 5

您链接到的文档包含以下声明:

“系统不会提示用户授予普通权限,用户也无法撤销这些权限。”

因此,除 之外的所有权限都WRITE_EXTERNAL_STORAGE将始终被授予。您必须请求的唯一许可是可以撤销的许可。

为什么权限设置中没有显示权限

好吧,根据 Android 版本的不同,它们可能有点难找到。例如,在运行 android 7.0 的模拟器上,我在 Apps -> MyApp -> Permissions 下找到了所有权限的列表,然后单击溢出菜单中的“所有权限”。

在此输入图像描述