【问题标题】:When adding view to window with WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, it is not getting touch event使用 WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY 将视图添加到窗口时,它没有收到触摸事件
【发布时间】:2016-05-10 12:26:54
【问题描述】:

我需要在拨号器应用程序顶部显示我的视图,因此我为此使用了 TYPE_PHONE,它是可触摸的,但仍然在某些设备上,例如设备的 Nexus 5 拨号器应用程序隐藏它。

尝试使用 TYPE_SYSTEM_OVERLAY 使视图在拨号器应用程序顶部可见,但触摸不存在。任何有关这方面的帮助都会很棒。

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    经过大量搜索上述问题,我找到了自己的解决方案。这就是我如何使视图位于设备内部的所有内容之上并使其可触摸,这是 TYPE_SYSTEM_OVERLAY 无法实现的。

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                            WindowManager.LayoutParams.MATCH_PARENT,
                            WindowManager.LayoutParams.WRAP_CONTENT,
                            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                            PixelFormat.TRANSPARENT);
    
    params.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.addView(view, params);
    

    【讨论】:

    • 出现错误:“原因:android.view.WindowManager$BadTokenException: 无法添加窗口 android.view.ViewRootImpl$W@d46dbf4 -- 此窗口类型的权限被拒绝”OS 6.0 Marshmallow
    • @AhmadShahwaiz 为了向窗口添加视图,我们需要在清单中提及系统级权限 android.permission.SYSTEM_ALERT_WINDOW。在 Os 6.0 Marshmallow 上,我们必须在运行时请求权限,然后才能将视图添加到窗口,如下所示(因为这是系统权限)if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, OVERLAY_REQ_CODE); }
    • 是的,我正在这样做,但没有调用回调方法。从哪里可以检查用户是否已授予权限。下面没有被调用。 @TargetApi(Build.VERSION_CODES.M) @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); }
    • @AhmadShahwaiz 上面的代码将使用我们在 onActivityResult 方法中获得回调的活动来调用。如果您在服务中检查上述权限,那么您可能需要添加一个虚拟透明活动以从服务启动,您可以在其中向用户询问权限,然后在 onActivityResult 虚拟活动中您将从用户那里获得结果。然后,您将需要通知您的服务是否根据用户响应向窗口添加视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2011-05-03
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多