背景
我记得有人告诉(在 Google 的一个视频中),如果应用程序的先前版本更新为在新版本上具有 targetSdk 23,那么之前授予的所有权限 - 现在将保持授予状态。
因此,例如,如果您安装了一个具有 targetSdk 22 的应用程序,这需要从联系人读取的权限,那么即使在应用程序升级到具有 targetSdk 23 的应用程序之后,它也会保持这种状态。
原因很简单:用户在安装时已经授予权限。
问题
根据我的发现,这条规则有一个例外:
如果您的应用程序具有 SYSTEM_ALERT_WINDOW 权限,而现在您升级到 targetSdk 23,它会被撤销(重置),您需要向用户请求它。
文档中的任何地方都没有提到这种行为:
- http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW
- http://developer.android.com/guide/topics/security/permissions.html
- http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html
- http://developer.android.com/about/versions/marshmallow/android-6.0.html
而且在我看过的任何视频中也没有。
关于 SYSTEM_ALERT_WINDOW 权限唯一提到的是,您需要以不同的方式处理它们,使用ACTION_MANAGE_OVERLAY_PERMISSION请求权限,并使用Settings.canDrawOverlays(...)检查是否授予权限
我试过的
我试图就这个问题联系谷歌,他们说这是故意的:
我与开发团队进行了交谈,您看到的行为正在按预期工作。这记录在这里: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、管理员、使用权限、可访问性访问、通知访问……?
编辑:关于#2,这是来自谷歌的答案(链接在这里):
在操作系统升级时,应用程序应保留 SYSTEM_ALERT_WINDOW。Pre-API 23 应用程序默认具有权限,而 API 23 应用程序默认关闭。但是,有一个已知的错误,即对于 API 23 应用程序,它们在升级时会丢失 SYSTEM_ALERT_WINDOW。对开发人员的建议是始终在启动时检查 SYSTEM_ALERT_WINDOW 的状态,如果未授予,则将用户定向到设置。我们将在未来的版本中修复该问题。