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


80

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

关于新的棉花糖权限模型,已经有很多文档。其中之一是SYSTEM_ALERT_WINDOW被“提升”为“高于危险”权限类别,因此需要特殊的用户干预才能与这些用户一起授予应用程序权限。如果应用程序的版本为targetSdkVersion22或更低,则应用程序会自动获得此权限(如果清单中要求)。

但是,我注意到有些应用程序具有此权限,而无需将用户引导到的设置特殊页面 Draw over other apps权限的。我看到了Facebook,Evernote,Pocket-也许还有更多。

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

谢谢



stackoverflow.com/questions/33139754/…这篇文章帮助我显示了写入外部文件的对话框许可
Bharath

Answers:


110

这是棉花糖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
尽管我不知道为什么突然出现“高于危险”的许可现在“低于正常”。我的意思是,您甚至都不会在弹出窗口中看到此权限,并且应用程序可以自动获得它。有什么想法吗?
oriharel

above dangerous如果您将应用程序侧载,则该权限实际上仍然保留,但未授予该权限。只有Play商店具有不同的行为并自动授予权限,也许他们认为Play商店上的应用程序不是恶意的并且可以信任。或者,也许他们收到了很多有关此更改的投诉,因此他们决定找到一种解决方法。
Mattia Maestrini

2
@oriharel我想知道Facebook Messenger的大规模推广是否会朝这个方向推动Google来支持这一点。可能是Facebook与Google达成协议,不强迫用户授予许可,以便聊天头可以继续工作。
dennisdrew '16

3
当我问到自动授予此权限的行为(我认为原因是其他原因:targetSdk)时,Google的回答是“这是一种有意的行为,它允许流行的应用程序继续运行,直到我们在这些应用程序迁移的平台。” 。帖子如下:code.google.com/p/android/issues/detail? id
android开发人员

1
@MattiaMaestrini您可以看看这个类似的问题吗?stackoverflow.com/questions/54378632/…–
ram

72

是的,棉花糖问世后,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. 如果API超过23,则检查用户是否获得许可

  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;

1
@JaymanJani嗨,这对我有用,但我想打开按钮以关闭事件
PriyankaChauhan

onPermission授予我该怎么办?我想打开该应用程序
Santanu Sur

好的解决方案。但是无需再次在onActivityResult方法中检查canDrawOverlays权限,因为我们已经在checkPermission()方法中进行了检查。
VahidShir

效果很好,但现在我无法点击工具栏菜单项。有可能做到吗?
Pablo R.

嘿,如果有人遇到问题,请让我知道,谢谢
Jayman Jani

12

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

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


你怎么会知道这事?该文档说它仍在预览中。developer.android.com/guide/topics/ui/bubbles
Noa Drach

正确@NoaDrach,这就是为什么我以后说Google最终会弃用SAW的原因-即Bubble API稳定时。youtu.be/td3Kd7fOROw?t=136
开发人员Dickson

谢谢,我是在问我的应用程序(尚不针对Q),曾经从Play商店安装时自动获得此权限,现在我们没有自动获得它。我想这它的B / C - reddit.com/r/androiddev/comments/a69q0i/...
诺亚德劳奇

@Dicksonthedeveloper请让我如何确定哪个设备不具有SYSTEM_ALERT_WINDOW功能或屏幕覆盖权限,我需要该stackoverflow.com/questions/63938787/…的
Shaikh Mohib

Android 11包含此API
NothingtoSay

5

对于那些想要从Play商店下载该应用程序时自动获得此权限的用户,除了清单中的SYSTEM_ALERT_WINDOW之外,您还应该转到此链接并向Google提出请求。

您必须提供一些其他信息,说明为什么需要此权限,然后Google会审核并自动授予您权限。

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

  • 在清单中具有SYSTEM_ALERT_WINDOW权限

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

如果我错过了任何事情,请随时更新答案


现在这必须是正确的答案。谢谢。请仅添加您对我们如何以编程方式请求用户此许可的答案。
埃伦·图菲克西

2

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


根据更新的Play商店政策(自2018年8月起),您不应将SDK限制为26以下,请参阅此参考链接1)developer.android.com/distribute/best-practices/develop/…2medium.com/codespace69/…
Jayman Jani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.