Android 软键盘无法与辅助功能服务和 WindowManager 一起正常工作

问题描述 投票:0回答:2

所以,在搜索了 GoogleSO 这个特定问题之后,我终于来了,这个问题在过去的三天里让我发疯了。有很多答案,但似乎都没有解决这个具体问题。这是我迄今为止发现的,

自动显示键盘

Android 软键盘无法使用

如何从辅助服务中隐藏和显示 Android 软键盘

窗口管理器阻止浮动聊天头下方应用程序的键盘

Android:当焦点位于 EditText 上时自动显示软键盘

Android - 键盘未出现在浮动窗口中


我想要达到的目标

  • 我想从
    EditText
    打开一个带有
    AccessibilityService
    的屏幕(这部分已完成)。
  • 打开键盘并在
    EditText
    中输入文本。
  • EditText
    (通过单击按钮)获取输入文本,并将其发送到
    Messaging App
    EditText,然后对Messaging App中的send按钮执行单击事件。这一切都将使用
    AccessibilityService
    完成,而不是由用户完成。
  • 当用户展开
    notification_panel
    或按导航区域中的
    Back
    Home
    Recents
    按钮时,应移除覆盖的屏幕。

问题

我无法在

EditText
中使用
WindowManager
中的
AccessibilityService
来处理键盘及其输入。

场景/用例

场景1(图1)

-> 使用窗口类型

TYPE_APPLICATION_OVERLAY
和窗口标志
FLAG_NOT_FOCUSABLE
来扩展视图。

能够实现

  • 我可以收听
    AccessibilityService
    中的所有事件。
  • notification_panel
    展开时,我可以删除覆盖的窗口。
  • 我可以监听导航按钮,并相应地处理代码。

无法实现

  • 无法通过单击
    EditText
    或以编程方式显示键盘。

到目前为止我所尝试过的

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        chattingLayoutParams = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        )
    } else {
        chattingLayoutParams = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        )
    }

还有这个(但不起作用)

val imm: InputMethodManager =
            getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(someEditText, InputMethodManager.SHOW_IMPLICIT)

场景2(图2)

-> 使用窗口类型

TYPE_APPLICATION_OVERLAY
和窗口标志
FLAG_NOT_TOUCH_MODEL
来扩展视图。

能够实现

  • 显示键盘并输入文本。

无法实现

  • 无法触发SccessibilityService中的
    事件
  • 无法触发
    notification_panel
    更改以删除覆盖的窗口。
  • 无法触发导航按钮(后退、主页、最近使用)删除覆盖窗口的操作。

到目前为止我所尝试过的

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        chattingLayoutParams = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT
        )
    } else {
        chattingLayoutParams = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT
        )
    }

AccessibilityService
Config.xml 文件

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackSpoken"
android:accessibilityFlags="flagReportViewIds"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100" />

希望问题已解决,如有不便,敬请谅解。

android android-edittext android-softkeyboard android-windowmanager accessibilityservice
2个回答
0
投票

这是因为当您覆盖屏幕时,输入管理器需要满足不透明度条件不超过InputManager.getMaximumObscuringOpacityForTouch(),当前为0.8f。

刚刚设置 chattingLayoutParams.alpha = 0.8f 修复它。


0
投票

我遇到了同样的问题,我选择的标志是

WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE

但如果它是模式,你可能需要 FLAG_NOT_TOUCH_MODAL

© www.soinside.com 2019 - 2024. All rights reserved.