当用户在显示通知时尝试授予权限时,Android会显示“屏幕叠加检测到”消息。

80

我在Nexus 6上使用的是Android Marshmallow。我正在尝试解决以下问题:

如果用户在通知显示时尝试授予权限,则会显示“检测到屏幕覆盖”消息,并且请求权限对话框会消失 - 当然,应用程序无法获得所请求的权限。 (请参阅屏幕截图)

我尝试通过在清单中添加“DRAW OVER OTHER APPS”权限 - android.permission.SYSTEM_ALERT_WINDOW来解决该问题,但没有成功。

PS:我确定问题是由通知引起的。我没有安装任何覆盖其他应用程序的应用程序,甚至关闭了设置中具有“Draw over other apps”权限的所有应用程序。 没有帮助..

有人知道这个问题的解决方案吗?

输入图像描述


2
这不是你需要在代码中“修复”的问题。这是 Android 中的一个错误(或者说一个设计不佳的错误信息),希望谷歌在未来的版本中可以修复它。 - Learn OpenGL ES
@LearnOpenGLES 我认为你是对的。 - Alexi Akl
3
当Facebook Messenger处于打开状态(在后台运行)时,这种情况也发生在我身上。 - Tim
1
如果正在显示一个toast,这也会发生。 - GLee
在所有其他设备上应用程序都正常工作,但在Nexus上出现问题时,我正在寻找解决方案,有点像个傻瓜一样重启了设备,这为我解决了问题 :) - shadygoneinsane
显示剩余4条评论
13个回答

74
在我遇到的情况下,问题是由我自己造成的。这是因为我同时使用Toast来向用户显示信息,并且在请求权限时发生了这种情况。同时进行这两个动作会导致此类错误。
其他答案可能解决其他人的问题。但我想指出,您应该小心自己造成的叠加错误。在同时请求权限的同时,小心不要覆盖视图中的某些内容。

4
我遇到了同样的问题,我移除了提示框,它就不再出现了。 - shijin
1
遇到了同样的问题。移除了 Toast,现在运行得很好。 - Dennis Anderson
1
使用这个解决方案解决了完全相同的问题。在请求权限之前,我会显示一个toast消息。 - Sandoval0992
这对我解决了问题。我之前一直在使用“Toast”进行调试,这也可能是其他人遇到此问题的主要原因。 - Minoru
Toast用于在请求权限的同时向用户显示信息。这对我很有帮助。 - Shailendra Madda

8

卸载Clean Master应用程序。我卸载了它,问题就解决了。


2
我尝试了这个,但没有帮助。相反,它导致了不必要的卸载。 - user3251882
1
我尝试了这个,确实有帮助。它导致必要的卸载。谢谢!(Sony Xperia Z3) - justinsg
1
卸载不应该是解决方法。请查看 https://dev59.com/4lsW5IYBdhLWcg3wDzku#39826828 获取正确的答案。 - akshay
在我的情况下,是 Facebook Messenger,不需要卸载,只需强制停止即可。 - Hamzeh Soboh

5
这个问题出现是因为一些罪犯应用程序,如Twilight、cleaner-master、drupe等。
要解决这个问题,您需要为那些罪犯应用程序禁用屏幕覆盖。
我有一个moto g4 plus手机,这就是我解决这个问题的方法:
进入设置 - 选择应用程序 - 再次选择应用程序中的设置图标 - 选择绘制其他应用程序 - 禁用对其他应用程序造成麻烦的罪犯应用程序。
我的做法是通过禁用此权限检查每个应用程序并尝试运行我的应用程序,最后我发现一个应用程序会干扰其他应用程序的覆盖,所以在最后我只禁用了这个应用程序。
截图:

Select Apps select configure setting

select draw over other appsdisable culprit apps


MobileGoConnector和Mobile Go不在我的手机上显示。 - Keshav Gera
现在我该做什么? - Keshav Gera
1
@KeshavGera,它永远不会出现问题,因为它不是内部应用程序,我是外部安装的。对于你来说,导致覆盖问题的应用程序可能是不同的应用程序。在我的情况下,这两个应用程序导致了覆盖问题。 - Sagar Chavada
@KeshavGera 你应该通过禁用覆盖权限来检查每个应用程序。 - Sagar Chavada

3

从这里和其他论坛的多个答案中获得了见解。

总结我如何解决这个问题:

  1. 进入“设置”>“应用程序”>(你的应用程序出现问题)
  2. 按住电源按钮,直到出现关机、重启、飞行模式的窗口
  3. 按住“关机”选项
  4. 选择安全模式下重启
  5. 进入“设置”>“应用程序”>(你的应用程序出现问题)
  6. 选择所需的权限
  7. 在Android M更新后,Messenger、Whatsapp、Prisma等应用程序可能会出现问题。

如果有任何问题,请告诉我。

注意:我使用的是One plus One手机。


1
但是作为开发人员,我们希望通过编码来解决问题,而不是通过您的这种(安全模式重启)方法。 - Rakesh Yadav
你是正确的,Rakesh,这不是理想的解决方案。但到目前为止,我还没有其他适用于我的手机的解决方案。 - user3251882
目前对我来说有效!希望谷歌在Nougat+版本中修复它。 - Surendra Kumar

2
这个弹窗是由清单文件声明的manifest.PERMISSION.SYSTEM_ALERT_WINDOW权限引起的。
有3类权限开发者必须注意:
普通权限 - 仅在清单文件中声明即可。 易受攻击的权限 - 在清单文件中声明,并在第一次使用时请求用户授权。它们可以通过系统设置进行更改。
危险权限:SYSTEM_ALERT_WINDOW和WRITE_SETTINGS属于此类别。它们必须被授予,但在系统设置中不可见。要请求此权限,您不能使用标准方式(int checkSelfPermission(String permission)),而是必须适当地检查Settings.canDrawOverlays()或Settings.System.canWrite(),否则您将收到异常,如下所示:

无法添加窗口android.view.ViewRootImpl$W@1de28ad - 拒绝此窗口类型的权限

1-按照以下给出的方式在代码中自己请求此权限:
public class MainActivity extends AppCompatActivity {

public final static int REQUEST_CODE = 10000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (checkDrawOverlayPermission()) {
          Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
    }
}

public boolean checkDrawOverlayPermission() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return true;
    }
    if (!Settings.canDrawOverlays(this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, REQUEST_CODE);
        return false;
    } else {
        return true;
    }
}

@Override
@TargetApi(Build.VERSION_CODES.M)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
              Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
        }
    }
}

1
我刚刚删除了我的应用并关闭了我的Nexus 6P。重新打开后,我重新安装了该应用程序,当授予权限时不再出现“屏幕叠加”对话框。

1
这更接近于评论而不是答案。您可以详细说明一下为什么这样做有效。如何回答 - AgataB
1
@AgataB 我是StackOverflow的新手。当时我没有评论的权限,也不知道为什么关闭手机和卸载应用程序会起作用,我只是觉得可能有帮助。 - College Student

0
只要Android 6.x在某些设备上存在错误,导致“覆盖警报”无缘无故地显示(根据我的分析数据,在2%到5%的设备上),最好的解决方案是通过将targetSdk定义为22来避免整个权限过程。
请注意,您不能将目标SDK降级为新版本,否则当用户更新时会引发INSTALL_FAILED_PERMISSION_DOWNGRADE错误,需要卸载/安装应用程序。

0

您必须禁用列表中所有应用程序的覆盖层。只有这样,您才能修改所需应用程序的授权。 我在安全模式下完成了这个操作,并且它起作用了。 最后,我重新启动了手机,现在一切正常。


0

我将我的Sony Xperia Z3(双卡)更新到了Android 6.0.1(Marsmallow)。我一直遇到屏幕重叠的问题。对我来说,我没有安装Clean Master、Du Speed或Du Booster(这是我读到的解决方案)。

所以我通过寻找任何屏幕重叠应用程序来解决我的问题。

屏幕重叠应用程序是一种可以在主屏幕上访问其他应用程序而不离开主屏幕的应用程序。所以对于我来说,在我的情况下,屏幕重叠应用程序是OMNI SWIPE。因此,如果您面临此问题,您需要冷静下来并检查哪个应用程序符合屏幕重叠应用程序的定义。

找到该应用程序并卸载,然后重新启动手机。

我刚刚完成了这个过程,并且使用手机非常愉快。

祝你好运!


0

解决方案是

onRequestPermissionsResult方法中删除Toast消息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接