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

时间:2016-03-15 16:03:35

标签: android android-permissions android-6.0-marshmallow target-sdk system-alert-window

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

的情况下授予应用此权限

由于

5 个答案:

答案 0 :(得分:97)

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

答案 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 如果用户允许一次,那么每次打开应用程序时都不要问它所以请听解决方案 -

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

  2. 如果是23+ API则检查用户是否允许

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

  4. 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或更高版本,那么将在运行时请求授予权限。