一些权限的保护级别似乎被错误地记录或实施

Some Permissions' protectionLevel seems wrongly documented or implemented

我 运行 在 ListView 中通过许多标记为 PROTECTION_NORMALPROTECTION_DANGEROUS 的权限。单击我的应用程序调用 ActivityCompat.requestPermission().

我测试的所有权限(我的意思是所有 normaldangerous permissions for API-7 and above I could find)在我的模拟器上工作正常,除了一些:

总是returnsPackageManager.PERMISSION_DENIED请求CHANGE_NETWORK_STATE(甚至没有提示)。 我希望默认授予它,因为它被标记为 normal,或者如果文档有误,那么系统会提示它。

请求 GET_ACCOUNTS 在提示后有效,但文档将此权限列为 normal 而不是 dangerous(对话框要求 "access your contacts")。 我希望默认授予它,因为它被标记为normal并且不会提示它。

listed 是来自 SMS 权限组的权限,但 Manifest.permission 包中不存在该权限。

是的,所有权限都在我的AndroidManifest.xml.

问题

  1. 只有我有这个吗?
  2. 它是特定于模拟器的吗?
  3. 文档有问题还是预览版本有误?

requestPermission() 的文档声明它应该只在 dangerous 保护级别和 未被授予 的权限下调用。您是否先调用 checkSelfPermission() 并且仅在失败时请求?

目前的图片还是预览图,所以可能是哪里出了问题。但是,按理说,如果文档声明 API 仅应在特定条件下调用,那么如果不满足这些条件,它们可能会出现错误。

确实是。

事实证明这些是正在进行中的工作并且大部分都承认错误。

我为 GET_ACCOUNTS 发布了一个新错误,但尚未报告。

主要针对最终版本/文档(又名非预览版)进行修复。

自 Marshmallow(自预览版 3 起),内省显示 CHANGE_NETWORK_STATE 已移至保护级别 signature|appop|pre23|preinstalled。使用 requestPermissions() 对此不起作用。文档似乎不是最新的。实际上,CHANGE_NETWORK_STATE 也已与 WRITE_SETTINGS 合并,如 logcat 输出所示:

was not granted  either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.

作为用户,您可以通过进入 "Settings / Apps / Configure apps / Modify system settings" 并打开 "Allow modify system settings" 来授予这两种权限。您的应用可能会直接触发正确的 activity(尽管这是一种非常粗鲁的用户体验):

Uri selfPackageUri = Uri.parse("package:" + getApplicationContext().getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, selfPackageUri);
startActivity(intent);

最后,您可以通过调用 Settings.System.canWrite().

检查是否允许这样做