Facebook、Evernote、Pocket - 所有应用程序都自动在 Android 6.0 上获得此权限,即使它们的目标是 23 (targetSdkVersion=23
)。
有很多关于新的 Marshmallow 权限模型的文档。其中之一是 SYSTEM_ALERT_WINDOW
被“提升”为“超过危险”权限等级,因此需要特殊的用户干预才能授予应用程序这些权限。如果应用具有 targetSdkVersion
22 或更低,应用会自动获得此权限(如果在清单中请求)。
但是,我注意到一些应用程序获得了此权限,而无需将用户发送到 Draw over other apps
权限的设置特殊页面。我看到了 Facebook、Evernote、Pocket——也许还有更多。
任何人都知道如何在用户不经过 Settings -> Apps -> Draw over other apps
的情况下向应用授予此权限?
谢谢
这是 Marshmallow 6.0.1 中引入的新行为。
每个请求 SYSTEM_ALERT_WINDOW
权限并通过 Play 商店安装的应用程序(需要 6.0.5 或更高版本)都会自动授予该权限。
相反,如果应用程序是旁加载的,则不会自动授予权限。您可以尝试从 apkmirror.com 下载并安装 Evernote APK。如您所见,您需要在 Settings -> Apps -> Draw over other apps
中手动授予权限。
这些提交 [1] [2] 允许 Play 商店自动授予 SYSTEM_ALERT_WINDOW
权限。
是的,Marshmallow 之后,Android 使安全级别更加稳定,但对于
SYSTEM_ALERT_WINDOW
您可以显示浮动操作和任何内容您可以通过在 onCreate()
方法中遵循代码来强制用户授予权限 将此代码放在 setContentView 之后
// Check if Android M or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}
操作 ACTION_MANAGE_OVERLAY_PERMISSION
直接启动“在其他应用程序上绘制”权限屏幕。
编辑:我上面的代码工作 100% 正确
但是我刚刚发现很多人仍在搜索如何允许ACTION_MANAGE_OVERLAY_PERMISSION
永久像如果用户有允许权限一次然后不要在每次打开应用程序时都询问它所以听听解决方案 -
检查设备是否有 API 23+ 如果 23+ API 然后检查用户是否有许可 如果有许可一次不要将他带到 Settings.ACTION_MANAGE_OVERLAY_PERMISSION 并且如果还没有许可则请求运行时许可检查
在您的 onCreate()
方法中放入以下行。把它放在 setContentView
之后
checkPermission();
现在将以下代码放入 onActivityResult
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (!Settings.canDrawOverlays(this)) {
// You don't have permission
checkPermission();
} else {
// Do as per your logic
}
}
}
现在终于 checkPermission 方法代码
public void checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
}
不要忘记在你的类中声明这个公共变量
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
现在(2019)Google 在 Android Q 中以 Bubbles 的形式提供了 SYSTEM_ALERT_WINDOW
的替代 API,Google 决定最终在未来的 Android 中弃用 SYSTEM_ALERT_WINDOW
发布。
Android Go 设备将不再授予此权限,即 Settings.canDrawOverlays() == false
对于那些希望在从 Play 商店下载应用程序时自动获得此权限的人,除了 Manifest 中的 SYSTEM_ALERT_WINDOW 之外,您应该转到 this link 并向 Google 请求此权限。
您必须提供一些额外信息,说明您需要此权限的原因,Google 会审核并自动授予您权限。
请记住,在您提出要求之前,您必须:
在 Manifest 中拥有 SYSTEM_ALERT_WINDOW 权限
提示用户在您的应用中授予 SYSTEM_ALERT_WINDOW 权限(如果尚未授予)
如果我错过了什么,请随时更新答案
如果应用针对 API 22 或更低版本,则即使其设备是 Android 6.0,Play Store 也会在用户点击安装时授予 SYSTEM_ALERT_WINDOW 权限和其他权限(显示警报)否则,如果应用针对 API 23 或更高版本,则权限将请求在运行时授予。
above dangerous
,则未授予权限。只有Play商店有不同的行为并自动授予权限,也许他们认为Play商店中的应用程序没有恶意并且可以信任。或者他们收到了很多关于此更改的投诉,他们决定寻找解决方法。