
我们都知道InputMethodManager没有api,它允许第三方应用程序获取是否显示输入法.

我最近使用了三星S8附带的Note应用程序,发现它可以知道输入方法是否实时显示. 碰巧可以从GP下载Samsung的Note应用程序三星自带输入法换皮肤,因此对apk进行了反编译并研究了源代码. 果然,我找到了一种检测输入法是否显示的方法:

private boolean isInputMethodShown(Context context) {
boolean isShown = false;
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
try {
Method isInputMethodShown = imm.getClass().getMethod("isInputMethodShown", new Class[0]);
isShown = (Boolean) isInputMethodShown.invoke(imm, new Object[0]);
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
return isShown;
}
其原理是反映InputMethodManager的isInputMethodShown方法. 我亲自测试了较旧的型号三星S4(Android 17)和最新的旗舰型号三星S8(Android 26)三星自带输入法换皮肤,它们都可以正确检测键盘的可见性. 但是在尝试了小米和华为的其他型号之后,没有isInputMethodShown这样的方法. 投机应该是三星自己添加的一种隐藏方法.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-271452-1.html
也不差哪12海里
打到他投降好不好