SYSTEM_ALERT_WINDOW - 如何在Android 6.0和targetSdkVersion 23上自动获得此权限

ori*_*rel 73 android android-permissions target-sdk system-alert-window android-6.0-marshmallow

Facebook,Evernote,Pocket - 所有应用程序都会自动在Android 6.0上获得此权限,即使它们的目标是23(targetSdkVersion=23).

关于新的Marshmallow权限模型有很多文档.其中一个SYSTEM_ALERT_WINDOW被"提升"为"高于危险"的权限级别,因此需要特殊的用户干预才能授予应用程序这些权限.如果应用程序有targetSdkVersion22或更低,app会自动获得此权限(如果在清单中请求).

但是,我注意到一些获得此权限的应用程序,无需将用户发送到设置特殊页面的Draw over other apps权限.我看到Facebook,Evernote,Pocket - 也许还有更多.

任何人都知道在没有用户通过的情况下如何授予应用程序此权限Settings -> Apps -> Draw over other apps

谢谢

Mat*_*ini 101

这是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权限.

  • 虽然我不知道为什么突然之间的"危险上层"许可现在"低于正常".我的意思是,你甚至没有在弹出窗口中看到这个权限,应用程序可以自动获取它.有什么想法吗? (6认同)
  • 当我询问这种自动授予此权限的行为时(我认为其他原因是:targetSdk)Google的回应是"这是一种允许热门应用继续工作的预期行为,直到我们在这些应用程序迁移的平台." .以下是帖子:https://code.google.com/p/android/issues/detail?id = 227123 https://code.google.com/p/android/issues/detail?id=222195 (3认同)
  • @oriharel我想知道Facebook Messenger的大规模推动谷歌是否会朝着这个方向努力支持这一点.可能是因为Facebook与谷歌达成协议而不强迫用户授予权限,以便聊天对象可以继续工作. (2认同)

Jay*_*ani 58

在棉花糖来之后,Android让安全级别更加坚持,但是

SYSTEM_ALERT_WINDOW
Run Code Online (Sandbox Code Playgroud)

你可以显示浮动动作和任何你可以强制用户给它的权限通过你的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);
    }
Run Code Online (Sandbox Code Playgroud)

该操作ACTION_MANAGE_OVERLAY_PERMISSION直接启动"绘制其他应用程序"权限屏幕.


编辑:我的上面的代码工作100%正确

但我发现很多人仍然在寻找ACTION_MANAGE_OVERLAY_PERMISSION 永久性的允许方式如果用户已经允许Permission Once那么每次打开应用程序时都不要问它,所以请听你的解决方案 -

  1. 检查设备是否具有API 23+

  2. 如果23+ API然后检查用户是否有许可

  3. 如果有许可,一旦不驱使他Settings.ACTION_MANAGE_OVERLAY_PERMISSION,如果还没有许可,那么请求运行时权限检查

在你的onCreate()方法中放在下面.把它放在后面setContentView

checkPermission();
Run Code Online (Sandbox Code Playgroud)

现在把代码放在下面 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 
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

现在最后是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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记在您的类中声明此公共变量

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
Run Code Online (Sandbox Code Playgroud)


Kza*_*zaf 12

对于那些希望在从 Play 商店下载应用程序时自动获得此权限的人,除了 Manifest 中的 SYSTEM_ALERT_WINDOW 之外,您应该转到此链接并向 Google 请求此权限。

您必须提供一些额外信息,为什么需要此权限,Google 会审核并自动授予您权限。

请记住,在您提出要求之前,您必须:

  • 在 Manifest 中拥有 SYSTEM_ALERT_WINDOW 权限

  • 提示用户在您的应用程序中授予 SYSTEM_ALERT_WINDOW 权限(如果尚未授予)

如果我错过了什么,请随时更新答案

  • 2021 年这仍然有效吗?“您的应用程序使用辅助功能服务,您需要提供解释,记录应用程序如何使用服务请求的系统功能。”这是您正在谈论的场景吗?在将应用程序启动到 Play 商店后,我们是否应该发送请求电子邮件? (2认同)

小智 7

现在(2019年)谷歌以Android Q中SYSTEM_ALERT_WINDOWBubbles形式提供了替代API ,谷歌决定最终SYSTEM_ALERT_WINDOW在未来的Android版本中弃用。

并且Android Go设备将不再授予此权限,Settings.canDrawOverlays() == false