一些权限的保护级别似乎被错误地记录或实施
Some Permissions' protectionLevel seems wrongly documented or implemented
我 运行 在 ListView
中通过许多标记为 PROTECTION_NORMAL
和 PROTECTION_DANGEROUS
的权限。单击我的应用程序调用 ActivityCompat.requestPermission()
.
我测试的所有权限(我的意思是所有 normal
和 dangerous
permissions for API-7 and above I could find)在我的模拟器上工作正常,除了一些:
CHANGE_NETWORK_STATE
总是returnsPackageManager.PERMISSION_DENIED
请求CHANGE_NETWORK_STATE
(甚至没有提示)。 我希望默认授予它,因为它被标记为 normal
,或者如果文档有误,那么系统会提示它。
GET_ACCOUNTS
请求 GET_ACCOUNTS
在提示后有效,但文档将此权限列为 normal
而不是 dangerous
(对话框要求 "access your contacts")。 我希望默认授予它,因为它被标记为normal
并且不会提示它。
READ_CELL_BROADCASTS
listed 是来自 SMS
权限组的权限,但 Manifest.permission
包中不存在该权限。
是的,所有权限都在我的AndroidManifest.xml.
问题
- 只有我有这个吗?
- 它是特定于模拟器的吗?
- 文档有问题还是预览版本有误?
requestPermission()
的文档声明它应该只在 dangerous
保护级别和 未被授予 的权限下调用。您是否先调用 checkSelfPermission()
并且仅在失败时请求?
目前的图片还是预览图,所以可能是哪里出了问题。但是,按理说,如果文档声明 API 仅应在特定条件下调用,那么如果不满足这些条件,它们可能会出现错误。
确实是。
事实证明这些是正在进行中的工作并且大部分都承认错误。
- https://code.google.com/p/android-developer-preview/issues/detail?id=2993
- https://code.google.com/p/android-developer-preview/issues/detail?id=3083
我为 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()
.
检查是否允许这样做
我 运行 在 ListView
中通过许多标记为 PROTECTION_NORMAL
和 PROTECTION_DANGEROUS
的权限。单击我的应用程序调用 ActivityCompat.requestPermission()
.
我测试的所有权限(我的意思是所有 normal
和 dangerous
permissions for API-7 and above I could find)在我的模拟器上工作正常,除了一些:
CHANGE_NETWORK_STATE
总是returnsPackageManager.PERMISSION_DENIED
请求CHANGE_NETWORK_STATE
(甚至没有提示)。 我希望默认授予它,因为它被标记为 normal
,或者如果文档有误,那么系统会提示它。
GET_ACCOUNTS
请求 GET_ACCOUNTS
在提示后有效,但文档将此权限列为 normal
而不是 dangerous
(对话框要求 "access your contacts")。 我希望默认授予它,因为它被标记为normal
并且不会提示它。
READ_CELL_BROADCASTS
listed 是来自 SMS
权限组的权限,但 Manifest.permission
包中不存在该权限。
是的,所有权限都在我的AndroidManifest.xml.
问题
- 只有我有这个吗?
- 它是特定于模拟器的吗?
- 文档有问题还是预览版本有误?
requestPermission()
的文档声明它应该只在 dangerous
保护级别和 未被授予 的权限下调用。您是否先调用 checkSelfPermission()
并且仅在失败时请求?
目前的图片还是预览图,所以可能是哪里出了问题。但是,按理说,如果文档声明 API 仅应在特定条件下调用,那么如果不满足这些条件,它们可能会出现错误。
确实是。
事实证明这些是正在进行中的工作并且大部分都承认错误。
- https://code.google.com/p/android-developer-preview/issues/detail?id=2993
- https://code.google.com/p/android-developer-preview/issues/detail?id=3083
我为 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()
.