You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android悬浮窗覆盖Facebook分享弹窗问题求解

解决悬浮窗覆盖Facebook分享弹窗的问题

这个问题的核心原因是你当前悬浮窗使用的TYPE_SYSTEM_ALERT属于系统级高层级窗口,而Facebook的分享弹窗是普通应用的Activity窗口,层级低于系统级窗口,所以会被你的悬浮窗覆盖。下面是几个可行的解决方案:

方案一:更换悬浮窗的Window类型(推荐)

根据你的Android版本,选择层级更低的窗口类型,让普通应用弹窗可以覆盖它:

针对Android 8.0(API 26)及以上版本

使用专门为应用悬浮窗设计的TYPE_APPLICATION_OVERLAY,这个类型的层级低于系统级弹窗,不会抢占普通应用窗口的显示优先级:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
    // 兼容低版本
    mParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}

针对Android 8.0以下版本

改用TYPE_PHONE类型,它的层级比TYPE_SYSTEM_ALERT低,普通应用的Activity弹窗可以正常覆盖:

mParams.type = WindowManager.LayoutParams.TYPE_PHONE;

替换完类型后,重新调用mFloatingManager.updateView(mView, mParams)更新悬浮窗参数即可。

方案二:动态隐藏/显示悬浮窗

如果不想修改窗口类型,可以在启动Facebook分享弹窗前暂时隐藏悬浮窗,等分享完成后再恢复显示:

  1. 启动分享前移除悬浮窗:
// 移除悬浮窗
mFloatingManager.removeView(mView);
// 启动Facebook分享Intent
context.startActivity(shareIntent);
  1. 监听分享完成的回调,重新添加悬浮窗:
  • 如果你的项目使用的是startActivityForResult(旧版):
// 在启动Intent时使用requestCode
context.startActivityForResult(shareIntent, REQUEST_CODE_FACEBOOK_SHARE);

// 重写onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_FACEBOOK_SHARE) {
        // 分享完成,重新添加悬浮窗
        mFloatingManager.addView(mView, mParams);
    }
}
  • 如果是AndroidX的ActivityResultContracts(新版):
// 注册回调
ActivityResultLauncher<Intent> shareLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        // 分享完成,重新添加悬浮窗
        mFloatingManager.addView(mView, mParams);
    }
);

// 启动分享时调用
shareLauncher.launch(shareIntent);

方案三:检查并调整窗口Flags

确保你的悬浮窗没有设置会提升层级的额外Flags,比如FLAG_ALT_FOCUSABLE_IM这类可能影响窗口优先级的标记。当前你设置的FLAG_NOT_FOCUSABLE等是合理的,但可以确认下是否有其他冲突的Flags。

注意事项

  • 使用TYPE_APPLICATION_OVERLAY需要确保已经申请了SYSTEM_ALERT_WINDOW权限,并且在Android 10及以上版本中,用户需要手动在设置中开启"显示在其他应用上层"的权限。
  • 动态隐藏悬浮窗的方式更稳妥,尤其是在一些特殊机型上,不同厂商对窗口层级的处理可能有差异。

内容的提问来源于stack exchange,提问作者Dayo Choul

火山引擎 最新活动