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

SYSTEM_ALERT_WINDOW - How to get this permission automatically on Android 6.0 and targetSdkVersion 23

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

关于新的 Marshmallow 权限模型有很多文档。其中之一是 SYSTEM_ALERT_WINDOW 已经 'promoted' 到 'above dangerous' 权限 class 因此需要特殊的用户干预才能授予应用程序。如果应用程序具有 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.

中手动授予权限

这些是允许 Play 商店自动授予 SYSTEM_ALERT_WINDOW 权限的提交 [1] [2]

如果应用的目标是 API 22 或更低,那么当用户点击安装(显示警告)时,Play 商店将授予 SYSTEM_ALERT_WINDOW 权限和其他权限,即使其设备是 Android 6.0 否则,如果应用程序针对 API 23 或更高版本,则将在 运行 时间内请求授予该权限。

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 直接启动 'Draw over other apps' 权限屏幕。


编辑: 我的上述代码 100% 正确

但我发现很多人仍在搜索如何允许 ACTION_MANAGE_OVERLAY_PERMISSION 永久地像如果用户允许权限一次然后每次打开应用程序时都不要询问它 所以听听你的解决方案-

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

  2. if 23+ API 然后检查用户是否有权限

  3. 如果有permit一次就不要开车送他去Settings.ACTION_MANAGE_OVERLAY_PERMISSION如果还没有permit就要求运行时权限检查

在您的 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);
        }
    }
}

并且不要忘记在 class

中声明这个 public 变量
public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

现在(2019)Google 以 Bubbles[的形式提供 API 到 SYSTEM_ALERT_WINDOW 的替代方案 在 Android Q 中,Google 已决定在未来的 Android 版本中最终弃用 SYSTEM_ALERT_WINDOW

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

对于那些希望在从 Play 商店下载应用程序时自动获得此权限的用户,除了清单中的 SYSTEM_ALERT_WINDOW 之外,您还应该转到 this link 并从 Google.

您必须提供一些额外的信息,说明您需要此权限的原因,Google 将审核并自动授予您权限。

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

  • 在Manifest中有SYSTEM_ALERT_WINDOW权限

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

如果我遗漏了什么,请随时更新答案