我记得曾经(在谷歌的一个视频中)告知,如果应用程序的先前版本更新为在新版本上安装了targetSdk 23,那么之前授予的所有权限 - 现在都会被授予。
因此,例如,如果你安装了一个带有targetSdk 22的应用程序,它需要一个从联系人那里读取的权限,那么即使在升级了应用程序之后,也可以使用targetSdk 23,它会保持这种状态。
原因很简单:用户在安装时已经授予了权限。
根据我的发现,这条规则有一个例外:
如果你的应用拥有SYSTEM_ALERT_WINDOW权限,现在你升级到targetSdk 23,它就会被撤销(重置),你需要从用户那里请求它。
文档中的任何地方都没有提到此行为:
我也没看过任何视频。
关于SYSTEM_ALERT_WINDOW权限,唯一提到的是,您需要以不同的方式处理它们,使用ACTION_MANAGE_OVERLAY_PERMISSION来请求权限,Settings.canDrawOverlays(...)检查是否授予了权限
我试图就此问题与Google联系,他们说这是故意的:
我与开发团队交谈过你所看到的行为 按预期工作。这在此处记录: http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW
在Android M中引发了SYSTEM_ALERT_WINDOW的保护级别。
是否还有其他具有此行为的权限?
如果应用程序有targetSdk 22/23,并且操作系统升级到Android 6,会发生什么? SYSTEM_ALERT_WINDOW(或任何其他权限)是否会被撤销?
非常确定其他内容会被授予,但我还是想问:其他类似特权的功能如何:SAF,admin,usage-access,accessibility access,notification access ,. ..?
编辑:关于#2,这是Google的回答(链接here):
在操作系统升级时,应用程序应保留SYSTEM_ALERT_WINDOW。预API 23应用程序 默认情况下具有权限,而不是关闭的API 23应用程序 默认情况下。但是,对于API 23应用程序,他们有一个已知的错误 在升级时丢失SYSTEM_ALERT_WINDOW。建议a 开发人员总是要检查SYSTEM_ALERT_WINDOW的状态 启动,如果未授予,则将用户定向到“设置”。我们将成为 在将来的版本中解决问题。