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

Requested Android permissions not showing in app permission settings

我正在开发需要权限 INTERNETWRITE_EXTERNAL_STORAGEACCESS_WIFI_STATECHANGE_WIFI_MULTICAST_STATE 的 Cordova 应用程序。我已经像这样在清单中请求了这些权限

<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" />

INTERNETACCESS_WIFI_STATECHANGE_WIFI_MULTICAST_STATE 被认为是正常权限,根据 docs 它们将在安装时被 Android 自动接受并且用户无法撤销它们。

现在,在 Cordova 创建的 MainActivity 中,我在一个 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);
        }

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

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

您链接到的 documentation 包含以下语句:

"The system doesn't prompt the user to grant normal permissions, and users cannot revoke these permissions. "

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

Why are the permissions not showing in the permission settings

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