【问题标题】:Screen Overlay Detected | (Android 6.x) Lenovo, Redmi & Samsung Devices检测到屏幕覆盖 | (Android 6.x) 联想、红米和三星设备
【发布时间】:2017-11-29 23:28:29
【问题描述】:

我创建了一个在后台连续运行并显示浮动覆盖 TextView 的应用程序(通过使用权限 android.permission.SYSTEM_ALERT_WINDOW)。

我在 Lenovo android 设备中遇到问题,当其他应用程序尝试请求用户许可时,会出现一个警告对话框,显示“检测到屏幕覆盖”。虽然我在 Redmi 3S Prime 设备上测试了相同的应用程序,但权限对话框中的“允许”按钮不可点击,直到我在我的应用程序中关闭了浮动覆盖 TextView。

那么有什么解决方案可以解决这个设备特定的问题吗?一种可能的解决方案可能是在用户可见权限对话框时禁用浮动 TextView,并在权限对话框关闭时显示浮动覆盖,但问题是如何从我的应用程序中检测其他前台应用程序的权限对话框打开/关闭状态。

请建议...

【问题讨论】:

  • 您是否申请了运行时覆盖权限??? ACTION_MANAGE_OVERLAY_PERMISSION 。这是android M上方的req
  • 我已经使用了 ACTION_MANAGE_OVERLAY_PERMISSION,这不能解决我的问题
  • @HimanshuMohta 您是否尝试过将 build.gradle(app) 文件中的 targetSdkVersion 减少到 21。有时它会起作用。
  • 21 也有同样的问题

标签: android android-permissions


【解决方案1】:

尝试使用 debug build -- targetSdkVersion 22。

签名 APK(适用于所有 targetSdkVersion(s))应用程序将正常工作。

【讨论】:

    【解决方案2】:

    只需从设备中清除 Es 资源管理器的数据,然后在重启设备后即可。

    【讨论】:

      【解决方案3】:

      我认为这两个链接可以帮助您。 firstlink secondlink

      【讨论】:

        【解决方案4】:

        如何从我的应用中检测权限对话框的打开/关闭状态??

        • 下面提到的实现方法,在第一个 Activity 的 onCreate 处运行此检查

          public final static int PERM_REQUEST_CODE_DRAW_OVERLAYS = 1234;

        /** * 绘制叠加层/在其他应用程序上的权限,与

        相关

        'android.permission.SYSTEM_ALERT_WINDOW'

        在清单中

        • 解决了 Android M 及以上版本的弹出窗口问题“检测到屏幕覆盖 - 要更改此权限设置,您首先必须从设置 > 应用程序关闭屏幕覆盖”
          • 如果应用尚未获得在屏幕上绘制的权限,请创建一个 Intent &
          • 将其目的地设置为

        Settings.ACTION_MANAGE_OVERLAY_PERMISSION

        & * 以

        的形式添加 URI

        “包装:”

        将用户直接发送到您的应用页面。

        注意:替代忽略 URI 将用户发送到应用程序的完整列表。

         public void permissionToDrawOverlays() {
                if (android.os.Build.VERSION.SDK_INT >= 23) {   //Android M Or Over
                    if (!Settings.canDrawOverlays(this)) {
                        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
                        startActivityForResult(intent, PERM_REQUEST_CODE_DRAW_OVERLAYS);
                    }
                }
            }
        

        在活动上调用,以检查设置中用户操作返回的结果

         @Override
              protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                if (requestCode == PERM_REQUEST_CODE_DRAW_OVERLAYS) {
                  if (android.os.Build.VERSION.SDK_INT >= 23) {   //Android M Or Over
                        if (!Settings.canDrawOverlays(this)) {
                            // ADD UI FOR USER TO KNOW THAT UI for SYSTEM_ALERT_WINDOW permission was not granted earlier...
                        }
                    }
                }
                  }
        

        注意:以上代码和摘录取自gist

        希望这有帮助!!!..

        【讨论】:

        • 实际上我想检测其他应用程序的权限对话框打开/关闭状态,而不是我的应用程序。如果其他应用程序尝试请求权限,我想在我的应用程序中删除浮动窗口,如果其他应用程序的权限对话框关闭,我想再次添加浮动窗口
        • @HimanshuMohta U 之前已经编辑了你的原始问题,但事实并非如此......无论如何,其他应用程序如何允许你更改其状态......这将是一种安全风险......对其他人来说应用程序,如果他们允许你做这样的事情,所以我认为这实际上是不可能的......无论如何......
        • 我编辑了,因为有一些误解。这也是可能的,因为 google play 上的应用程序也是如此。应用程序名称是 Network Monitor Mini
        【解决方案5】:

        不幸的是,这似乎是 Android 操作系统固有的,据我所知,没有办法检测到另一个应用程序何时请求权限。与其他应用交互的一般流程是以推送方式向它们发送 Intent,因此理论上 可以 如果其他应用向您的应用发送 Intent 以禁用覆盖,尽管这是不是一个实用的解决方案。

        我可能完全错了,但我还没有看到这个问题的编程解决方案。您可能会做的最好的事情就是警告您的用户您的应用可能会导致此问题,并为他们提供一个快速的临时禁用按钮。

        【讨论】:

        • 我在 google play 上看到了一个应用程序,它也是如此。应用名称是 Network Monitor Mini,但我不知道如何处理这个
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 2018-07-20
        相关资源
        最近更新 更多