Так что после долгого времени игры с AccessibilityServices, вставками окон, определением высоты экрана и т. Д., Я думаю, я нашел способ сделать это.
Отказ от ответственности: он использует скрытый метод в Android, что означает, что он может быть непоследовательным. Тем не менее, в моем тестировании, похоже, работает.
Метод: InputMethodManager # getInputMethodWindowVisibleHeight () , и существует с Lollipop (5.0).
Вызов, который возвращает высоту в пикселях текущей клавиатуры. Теоретически клавиатура не должна быть высотой 0 пикселей, поэтому я сделал простую проверку высоты (в Kotlin):
val imm by lazy { context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
if (imm.inputMethodWindowVisibleHeight > 0) {
//keyboard is shown
else {
//keyboard is hidden
}
Я использую Android Hidden API , чтобы избежать размышлений, когда я вызываю скрытые методы (я делаю это много для приложений, которые я разрабатываю, в основном это приложения для хакерских приложений / настройки), но это должно быть возможно с помощью отражения а также:
val imm by lazy { context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm) as Int
//use the height val in your logic