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
?
由于
答案 0 :(得分:97)
这是Marshmallow 6.0.1 中引入的新行为。
请求SYSTEM_ALERT_WINDOW
权限且通过Play商店安装的每个应用(版本 6.0.5 或更高版本都是必需的)将自动授予权限。
如果应用程序是侧载的,则不会自动授予该权限。您可以尝试从apkmirror.com下载并安装Evernote APK。如您所见,您需要在Settings -> Apps -> Draw over other apps
。
答案 1 :(得分:52)
Yeh 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;
答案 2 :(得分:8)
现在( 2019 ),Google在Android Q中以 Bubbles 的形式提供了SYSTEM_ALERT_WINDOW
的替代API,Google最终决定弃用{{ 1}}在未来的Android版本中。
Android Go设备将不再授予此权限
即SYSTEM_ALERT_WINDOW
答案 3 :(得分:8)
对于那些想要从Play商店下载应用程序时自动获得此权限的用户,除了清单中的SYSTEM_ALERT_WINDOW之外,您还应该转到this link并向Google提出请求。
您必须提供一些其他信息,说明为什么需要此权限,然后Google会审核并自动为您提供权限。
请记住,在要求此之前,您必须:
在清单中具有SYSTEM_ALERT_WINDOW权限
提示用户在尚未授予您的应用程序权限时授予SYSTEM_ALERT_WINDOW权限
如果我错过了任何事情,请随时更新答案
答案 4 :(得分:1)
如果该应用针对API 22或更低版本,则即使其设备为Android 6.0,Play Store也会在用户点击安装(显示提醒)时提供SYSTEM_ALERT_WINDOW权限和其他权限 否则,如果应用程序的目标是API 23或更高版本,那么将在运行时请求授予权限。