android 12后WindowManager事件穿透类型悬浮窗无效问题

这篇具有很好参考价值的文章主要介绍了android 12后WindowManager事件穿透类型悬浮窗无效问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

笔记:
项目需要将一个悬浮窗WindowManager仅显示view给用户看,不可操作,将触摸事件穿透到后面的窗口。WindowManager.LayoutParams代码如下

WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.type = Build.VERSION.SDK_INT < Build.VERSION_CODES.O ?
        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
        WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;

在android12以下的机型中测试都没问题,触摸事件可以穿透悬浮窗。但在android 12机型测试时,触摸事件无法穿透悬浮窗了。

原因

查了android开发者官网的android12变化后,发现
windowmanager.layoutparams.type_accessibility_overlay unable to add window -,笔记,android,android,android studio,ide

解决

方法1:

例外情况下运行执行穿透操作,这里就使用无障碍窗口
windowmanager.layoutparams.type_accessibility_overlay unable to add window -,笔记,android,android,android studio,ide

创建个无障碍服务,在服务连接后回调里创建个无障碍窗口类型的悬浮窗就好了

public class MyAccessibilityService extends AccessibilityService {

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        createWindow();
    }

    public void createWindow() {
        //悬浮窗类型
        int type;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
        } else {
            type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        }

        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.type = type;
        lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;

        wm.addView(view, lp);
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

    }

    @Override
    public void onInterrupt() {
    }
}

经测试有效

方法2:

此方法比方法1更简单,来源于WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE的源码注释。翻译截图如下
windowmanager.layoutparams.type_accessibility_overlay unable to add window -,笔记,android,android,android studio,ide
也就是说,只要在触摸路径中,它是该UID下唯一的TYPE_APPLICATION_OVERLAY窗口,并且alpha等于或小于最大遮挡不透明度也就是0.8。那么久可以使用WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE来实现触摸事件穿透

WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.type = Build.VERSION.SDK_INT < Build.VERSION_CODES.O ?
        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
        WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
//将alpha设置为最大遮挡不透明度
lp.alpha = 0.8f;

经测试有效文章来源地址https://www.toymoban.com/news/detail-541316.html

到了这里,关于android 12后WindowManager事件穿透类型悬浮窗无效问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android使用Jetpack WindowManager来开发可折叠设备的探索

    我们在Google开发者大会上,看到Jetpack WindowManager和WindowSizeClass这些技术,如下图。 那这里不得不说折叠屏手机了 在其中一个显示区域中运行一个应用。 同时运行两个应用,各位于一个显示区域中(在 multi-window 模式下)。 可折叠设备还支持不同的折叠状态。折叠状态可用来

    2024年02月08日
    浏览(32)
  • Unity3D Button 鼠标悬浮进入与鼠标悬浮退出按钮事件

    由于甲方验收未通过,项目需要改版,在修改界面时,想实现鼠标在一级菜单悬浮即可显示二级菜单的功能,主要如下图 注意,上图鼠标只是悬浮在场景漫游按钮上,并未点击左键或右键等 思路是让类继承IPointerEnterHandler IPointerExitHandler两个接口,然后实现其中的方法 代码如

    2024年02月16日
    浏览(37)
  • 浏览器F12定位悬浮下拉框元素

     解决办法 1. 鼠标悬浮于 设置 2. 点击鼠标右键显示 3. 鼠标移动到F12窗口,按N,成功定位到下拉框元素 

    2024年02月12日
    浏览(45)
  • Vue实现鼠标悬浮隐藏与显示图片效果 @mouseenter 和 @mouseleave事件

    前端vue 有个功能是鼠标移动到指定item上显示出来一个编辑和删除的图标 鼠标悬停在列表那么需要有悬浮显示的列表编辑和删除icon 文字不好描述,因为是web端录屏也比较麻烦 这里用截图说明 之前没做过这种效果,问了一下我的组长-豪哥 他告诉我很简单,利用vue的@mouseent

    2023年04月08日
    浏览(76)
  • android 悬浮窗 模拟微信通话返回桌面悬浮

    现有一款IM聊天需求,在通话页面点击缩小视图或者Home键返回桌面,点击悬浮窗回到通话页面这样一个需求。 权限 首先是权限的获取,请注意,在Android 8.0及以上版本中,需要申请悬浮窗权限(SYSTEM_ALERT_WINDOW)才能显示悬浮窗。你可以在应用启动时请求该权限,或者引导用

    2024年02月01日
    浏览(24)
  • Android 项目必备(四十四)-->Android 实现悬浮窗

    悬浮窗是一种比较常见的需求。例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。 本文将讲解悬浮窗实现步骤、原理、实例代码等 1. WindowMananger 接口 Android 的界面绘制,都是通过 WindowMananger 的服务来实现的。那么,既然要实现一个能够在自身应

    2024年02月12日
    浏览(27)
  • 怎么实现android 全局悬浮窗

    要实现 Android 全局悬浮窗,可以按照以下步骤: 在 AndroidManifest.xml 文件中添加 SYSTEM_ALERT_WINDOW 权限: 创建一个 Service 类,并在其中创建一个 WindowManager 来管理悬浮窗: 在悬浮窗 View 的布局文件中添加需要展示的内容: 在 Activity 中启动 Service: 最后,记得在不需要展示悬浮

    2024年02月11日
    浏览(29)
  • Android NestedScrollView悬浮固定顶部

    项目中有页面涉及到多个元素组 需要NestedScrollView包裹来上下滑动 接到需求 一些标题在滑动到顶部时需要置顶 我之前做过关于Android Behavior之ViewPager+Fragment+RecyclerView实现吸顶效果 大概就是这种效果 只不过这次是随意的组件 比如 TextView 或布局组件 RelativeLayout 等 废话不多说来

    2024年01月24日
    浏览(30)
  • Android 应用弹出悬浮窗

    Android开发者经常遇到应用想弹出悬浮窗的操作,而且有可能还想要高层级弹窗,就像ipone的浮标touch一样。android当然也有类似的悬浮图标,比如前些年我们的流量监控提醒。  这里我们忽略UI美学,简单记录一下: 1、基本使用 它的基本使用步骤是不会变的,只是有时候我们

    2024年02月16日
    浏览(25)
  • QML---鼠标事件与鼠标事件穿透

    QML中MouseArea作为一个界面常用的类型,经常会出现鼠标区域重合的问题,这个时候会触发鼠标事件的只有最上层(可以设置Item的z属性来控制item的z序,而在其下层的鼠标事件则不会触发,但是往往开发者所想的是两个都触发,这个时候就需要鼠标事件穿透了。但是在先穿透之

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包