【问题标题】:SYSTEM_ALERT_WINDOW - How to get this permission automatically on Android 6.0 and targetSdkVersion 23SYSTEM_ALERT_WINDOW - 如何在 Android 6.0 和 targetSdkVersion 23 上自动获取此权限
【发布时间】:2016-07-01 04:38:10
【问题描述】:

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

谢谢

【问题讨论】:

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


【解决方案1】:

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

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

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

  • 在 Manifest 中拥有 SYSTEM_ALERT_WINDOW 权限

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

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

【讨论】:

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

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

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

【讨论】:

【解决方案3】:

是的,在 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. 如果 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;

【讨论】:

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

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

【讨论】:

【解决方案5】:

这是 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 的巨大规模是否促使 Google 朝这个方向发展以支持这一点。可能是 Facebook 与 Google 达成了一项协议,不强迫用户授予权限,以便聊天头可以继续工作。
  • 当我询问这种自动授予此权限的行为时(我认为原因是其他原因:targetSdk),Google 的回答是“这是允许流行应用程序继续工作的预期行为直到我们在平台中有可供这些应用程序迁移的替代 API。” .以下是帖子:code.google.com/p/android/issues/detail?id=227123code.google.com/p/android/issues/detail?id=222195
  • @MattiaMaestrini 你能看看这个类似的问题吗? stackoverflow.com/questions/54378632/…
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多