93

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

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

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

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

谢谢

4

5 回答 5

120

这是 Marshmallow 6.0.1中引入的新行为。

每个请求SYSTEM_ALERT_WINDOW权限并通过 Play 商店安装的应用程序(需要6.0.5或更高版本)都将自动授予权限。

相反,如果应用程序是旁加载的,则不会自动授予权限。您可以尝试从apkmirror.com下载并安装 Evernote APK 。如您所见,您需要手动授予权限Settings -> Apps -> Draw over other apps

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

于 2016-03-15T18:14:53.027 回答
88

是的,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 永久允许,例如如果用户已允许权限一次,那么不要在每次打开应用程序时都询问它,以便为您听听解决方案-

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

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

  3. 如果有许可证,请不要开车去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;
于 2016-09-09T08:03:42.337 回答
18

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

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

于 2019-08-06T08:52:20.960 回答
15

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

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

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

  • 在 Manifest 中拥有 SYSTEM_ALERT_WINDOW 权限

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

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

于 2020-01-31T13:53:42.890 回答
3

如果应用针对 API 22 或更低版本,则即使其设备是 Android 6.0,Play Store 也会在用户点击安装时授予 SYSTEM_ALERT_WINDOW 权限和其他权限(显示警报)否则,如果应用针对 API 23 或更高版本,则权限将请求在运行时授予。

于 2016-04-07T21:05:05.640 回答