【问题标题】:How to implement a popup overlay that can be displayed over any other app in Android如何实现可以在 Android 中的任何其他应用程序上显示的弹出叠加层
【发布时间】:2017-11-29 02:04:33
【问题描述】:

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

Facebook 在其新的 Facebook Messenger 版本中实现了一个非常相似的功能,称为 Chatheads。我真的很惊讶地看到这是有可能的。在图像上,您会在另一个应用程序上看到一个聊天头(右侧的狗)。

【问题讨论】:

  • 我认为这是一个合理的问题。对于某些人来说,这可能是不好的说法。重新表述问题,使其更多地关注任何应用程序上的屏幕弹出式覆盖,而不是 Facebook Messenger 本身,将其作为您的示例。屏幕截图也很适合提供上下文。
  • 我希望我的问题现在好些了。
  • 看看 Google Play 上的 Facebook Messanger cmets。对于某些人来说,它不起作用,这可能与所有那些 TouchWizzes 和 HTC Senses 有关......
  • 正如我之前所说,我相信这个问题是合法的。任何关闭此问题的用户都应该真正解释为什么关闭它。这里没有交流。
  • piwai.info/chatheads-basics 就是答案。

标签: android user-interface


【解决方案1】:

完整的源代码在这里:http://www.piwai.info/chatheads-basics
注意:您需要<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

public class ChatHeadService extends Service {

  private WindowManager windowManager;
  private ImageView chatHead;

  @Override public IBinder onBind(Intent intent) {
    // Not used
    return null;
  }

  @Override public void onCreate() {
    super.onCreate();

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

    chatHead = new ImageView(this);
    chatHead.setImageResource(R.drawable.android_head);

    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);

    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 0;
    params.y = 100;

    windowManager.addView(chatHead, params);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    if (chatHead != null) windowManager.removeView(chatHead);
  }
}

【讨论】:

  • @jonney 这似乎是 Android 6 的问题。您必须在设置中明确允许这样做。
  • 因此您需要请求 SYSTEM_ALERT_WINDOW 权限。包安装程序在我请求运行时权限时崩溃。我怎样才能避免这种情况?
  • 我得到运行时异常说需要权限,但我给了权限
  • TYPE_PHONE 现在已弃用,并在 api >=28 上抛出 WindowManager$BadTokenException ... permission denied for window type 2002
【解决方案2】:

This 是浮动“聊天头”样式覆盖的最小、简单和通用示例。

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

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);

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

【讨论】:

  • TYPE_PHONE 现已弃用,并在 api 28 上抛出 WindowManager$BadTokenException ... permission denied for window type 2002>
【解决方案3】:

我知道现在发布答案已经很晚了,无论如何我都会将它发布给正在寻求答案的其他人

AndroidFloatingImage

【讨论】:

    【解决方案4】:

    如果您想要类似 Messenger 的行为,可以使用一个库:Bubbles

    如果您更喜欢自己实现它,请按照其他人的建议查看窗口管理器。你也可以看看Bubbles的源代码来获得启发。

    【讨论】:

      【解决方案5】:

      每个 Activity、对话框和服务都附有一个窗口。 Facebook 保持服务在后台运行,并在服务中通过

      获取窗口管理器对象

      windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

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

      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);
      

      【讨论】:

      • TYPE_PHONE 现已弃用,并在 api 28 上抛出 WindowManager$BadTokenException ... permission denied for window type 2002>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2011-10-13
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多