当屏幕覆盖处于活动状态时,不会出现软键盘

Softkeyboard does not appear when a Screenoverlay is active

我正在使用透明屏幕覆盖来检测用户何时长按 phone 的电源键(或者更确切地说,当出现关机选项对话框时),这工作正常。

不幸的是,当这个屏幕叠加层处于活动状态时,软键盘停止出现,这对我来说是个问题。我怎样才能避免这种情况?

我使用的代码很大程度上基于此:

public void warnOnShutdown() {
    if (Settings.canDrawOverlays(this)) {
        LinearLayout linearLayout = new LinearLayout(getApplicationContext()) {
            public void onCloseSystemDialogs(String reason) {
                if ("globalactions".equals(reason)) {
                    AntitheftStateManager.setShuttingDown(AntitheftService.this, true);
                }
            }

            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                return super.dispatchKeyEvent(event);
            }
        };

        linearLayout.setFocusable(true);

        View view = LayoutInflater.from(this).inflate(R.layout.system_overlay, linearLayout);
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        //params
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                100,
                100,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_FULLSCREEN
                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
        windowManager.addView(view, params);
    }
}

布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:orientation="vertical">

</LinearLayout>

编辑:

我应该提一下,LinearLayout 是从服务附加到 window 管理器的,这意味着键盘不仅对我的应用程序被阻止,它对整个 phone 都被阻止,因为只要服务是 运行.

当别人的代码被当成表面价值时会发生这种情况。事实证明,将类型从 TYPE_SYSTEM_ALERT 更改为 TYPE_SYSTEM_OVERLAY 解决了我的问题。

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            100,
            100,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT);