如何实现一个弹出式覆盖,可以显示在任何其他应用程序在Android上

如何实现一个弹出式覆盖,可以显示在任何其他应用程序在Android上,android,user-interface,Android,User Interface,我如何为可以显示在任何其他应用程序上的应用程序实现弹出式覆盖 Facebook在其新的Facebook Messanger版本中实现了一个非常类似的功能,叫做聊天头。我真的很惊讶地看到这是怎么可能的。在图片上,你看到一个聊天室(右边的狗)在另一个应用上 是浮动“聊天头”样式覆盖的一个最小、简单且通用的示例 它使用以下代码使事物浮动: windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); chatHead = new I

我如何为可以显示在任何其他应用程序上的应用程序实现弹出式覆盖

Facebook在其新的Facebook Messanger版本中实现了一个非常类似的功能,叫做聊天头。我真的很惊讶地看到这是怎么可能的。在图片上,你看到一个聊天室(右边的狗)在另一个应用上

是浮动“聊天头”样式覆盖的一个最小、简单且通用的示例

它使用以下代码使事物浮动:

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
chatHead = new ImageView(this);
chatHead.setImageResource(R.drawable.floating);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.TYPE_PHONE,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT);

可以找到完整的源代码(在Apache许可证下)。

我知道发布答案已经晚了,我会为其他正在寻找答案的人发布它

完整的源代码如下:
注意:您需要


如果您想要类似Messenger的行为,则有一个用于此的库:


如果您喜欢自己实现它,请按照其他人的建议查看窗口管理器。您还可以查看的源代码以获得灵感。

每个活动、对话框以及服务都附带一个窗口。Facebook在后台运行一项服务,在该服务中,他们获取窗口管理器对象

windowManager=(windowManager)getSystemService(WINDOW\u服务)

添加视图时创建所需的布局参数

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.TYPE_PHONE,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT);
现在通过以下方法将视图添加到窗口管理器

windowManager.addView(yourView, params);

我认为这是一个合理的问题。对某些人来说,这可能是不恰当的。重新表述这个问题,使其更关注任何应用程序的屏幕弹出覆盖,而不是Facebook Messenger本身,将其作为您的示例。屏幕截图也很好地给出了上下文。我希望我的问题现在更好。看看Facebook Messanger在谷歌Play上的评论。对于一些人来说,它不起作用,它可能与那些触摸屏和HTC感官有关……正如我之前所说的,我相信这个问题是合理的。关闭此问题的任何用户都应该真正解释关闭此问题的原因。这里没有通信。这就是答案。@jonney这似乎是安卓6的问题。您必须在设置中明确允许此操作。因此,您需要请求系统警报窗口权限。当我请求运行时权限时,包安装程序崩溃。如何避免这种情况?我得到了运行时异常,说需要权限,但我给了permissionTYPE\u PHONE现在不推荐使用,并抛出
WindowManager$BadTokenException。。。api>=28TYPE\U PHONE上的窗口类型2002的权限被拒绝,现在已弃用并引发
WindowManager$BadTokenException。。。api 28>type_PHONE上窗口类型2002的权限被拒绝,现在已弃用,并引发
WindowManager$BadTokenException。。。api 28上的窗口类型2002的权限被拒绝
windowManager.addView(yourView, params);