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

4

我正在开发一个Cordova应用程序,需要以下权限:INTERNETWRITE_EXTERNAL_STORAGEACCESS_WIFI_STATECHANGE_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" />

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

现在,在Cordova创建的MainActivity中,我添加了以下代码,位于一个检查我们是否在6.0或更高版本的if块内:

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);
        }

问题在于,在运行5.1.1的Android设备上,这个功能可以正常工作,当我进入应用程序的权限设置时,我可以看到所有4个权限。然而,在运行7.0和7.1.1的设备上,我会收到一个对话框,要求批准WRITE_EXTERNAL_STORAGE和所有其他权限,因为它们是普通权限,不需要经过批准就可以使用。问题在于,即使我已经获得了这些权限,在新设备上我仍然无法执行与这些权限相关的操作,如果我进入应用程序的权限设置,我只能看到Storage权限已被授予,没有INTERNET、ACCESS_WIFI_STATE或CHANGE_WIFI_MULTICAST_STATE权限。我没有专门在6.0设备上进行测试,但我认为我会遇到同样的问题。
为什么权限没有显示在权限设置中,为什么我不能执行需要这些权限的操作,尽管Android说我有权限?

你想要进行哪些操作? - Selvin
1
该应用程序使用类似Bonjour的服务来自动检测WiFi网络上的设备。在旧设备上,它可以很好地检测到设备。新设备则无法看到它。它发送搜索命令,但从未发现任何内容。 - Jason Crosby
1个回答

5
您提供的文档包含以下声明:
“系统不会提示用户授予普通权限,用户也无法撤销这些权限。”
因此,除了WRITE_EXTERNAL_STORAGE之外的所有权限都将永久授予。唯一需要请求的权限是可以被撤销的。

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

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

enter image description here


是的,我知道3个权限总是会被授予,但即使它们被授予,我仍然无法执行所需的功能。因此,我去检查了权限设置,并注意到在较新的设备上,列表中显示的唯一权限是存储权限。我正在使用类似Bonjour的服务来检测网络上的另一个设备。在旧设备上,应用程序可以工作并检测到设备,但在新设备上却不能。它只是坐着听,但从未找到它。 - Jason Crosby
我之前不知道“所有权限”的存在。我尝试了一下,确实有这些权限。 - Jason Crosby
@Jason Crosby - 好的,那么你至少可以确保这不是缺少权限的问题。我在想问题是否由于一些依赖于旧库的依赖关系(尝试做某些事情并悄悄失败)引起的,但恐怕我无法在这方面帮助你。 - Bö macht Blau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接