ChatGPT解决这个技术问题 Extra ChatGPT

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

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 的情况下向应用授予此权限?

谢谢

stackoverflow.com/questions/33139754/… 这篇文章帮助我显示了写入外部的对话权限

M
Mattia Maestrini

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


尽管我想知道为什么“高于危险”的许可突然变得“低于正常水平”。我的意思是,您甚至不会在弹出窗口中看到此权限,而应用程序可以自动获得它。有什么想法吗?
实际上,如果您侧载应用程序,则权限仍为 above dangerous,则未授予权限。只有Play商店有不同的行为并自动授予权限,也许他们认为Play商店中的应用程序没有恶意并且可以信任。或者他们收到了很多关于此更改的投诉,他们决定寻找解决方法。
@oriharel 我想知道 Facebook Messenger 的大规模是否推动了谷歌朝这个方向发展以支持这一点。可能是 Facebook 与谷歌达成了一项协议,不强迫用户授予许可,以便聊天头可以继续工作。
当我询问这种自动授予此权限的行为(我认为原因是其他原因:targetSdk)时,Google 的回答是“这是一种允许流行应用程序继续工作的预期行为,直到我们在这些应用程序迁移的平台。” .以下是帖子:code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
@MattiaMaestrini 你能看看这个类似的问题吗? stackoverflow.com/questions/54378632/…
E
Erik Ghonyan

是的,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 永久像如果用户有允许权限一次然后不要在每次打开应用程序时都询问它所以听听解决方案 -

检查设备是否有 API 23+ 如果 23+ API 然后检查用户是否有许可 如果有许可一次不要将他带到 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;

@JaymanJani嗨,这对我有用,但我想要开关按钮关闭事件
onPermission 授予我该怎么办?我想打开应用程序
很好的解决方案。但无需再次检查 onActivityResult 方法中的 canDrawOverlays 权限,因为我们已经在 checkPermission() 方法中检查了该权限。
它工作得很好,但现在我无法点击工具栏菜单项。有可能做到吗?
嘿,如果有人遇到问题,请告诉我谢谢
D
Dickson the developer

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

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


你怎么会知道这事?文档说它仍在预览中。 developer.android.com/guide/topics/ui/bubbles
真的@NoaDrach,这就是为什么我说将来谷歌最终会弃用 SAW - 即当 Bubble API 稳定时。 youtu.be/td3Kd7fOROw?t=136
谢谢,我在问我的应用程序(尚未针对 Q),用于从 Play 商店安装时自动接收此权限,现在我们没有自动获得它。我想这是 b/c - reddit.com/r/androiddev/comments/a69q0i/…
@Dicksonthedeveloper 请让我告诉我如何识别哪个设备没有 SYSTEM_ALERT_WINDOW 功能或屏幕覆盖权限我需要解决这个stackoverflow.com/questions/63938787/…
Android 11 包含此 API
K
Kzaf

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

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

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

在 Manifest 中拥有 SYSTEM_ALERT_WINDOW 权限

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

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


这一定是现在的正确答案。谢谢你。请添加您对我们如何以编程方式向用户请求此权限的答案。
这在 2021 年仍然有效吗? “您的应用程序使用无障碍服务,您需要提供说明,说明该应用程序如何使用服务请求的系统功能。”这是您所说的场景吗?我们应该在我们启动我们的应用程序以玩商店后发送请求电子邮件吗?
D
Dennix

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


根据更新的 Play 商店政策(自 2018 年 8 月起),您不应针对小于 26 的 SDK,请参阅此参考链接 1) developer.android.com/distribute/best-practices/develop/… 2) medium.com/codespace69/…