pqpo / inputmethodholder Goto Github PK
View Code? Open in Web Editor NEWA keyboard listener for Android which by hooking the InputMethodManager. 通过hook监听系统键盘显示
Home Page: https://pqpo.me/
License: Apache License 2.0
A keyboard listener for Android which by hooking the InputMethodManager. 通过hook监听系统键盘显示
Home Page: https://pqpo.me/
License: Apache License 2.0
虚拟键盘在更新输入框文字的时候是通过InputConnection这个最后来实现的,为什么Hook不住EditText中的InputConnection呢?
实际效果是Hook完毕后,点击虚拟键盘上面的文字,并没有回调InputConnection中相应的方法
06-19 10:25:56.721 12910-12910/pw.qlm.softinputmethodlistener W/InputMethodHolder: hook failed! detail:java.lang.ClassNotFoundException: android.app.SystemServiceRegistry at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:251) at java.lang.Class.forName(Class.java:216) at pw.qlm.inputmethodholder.compat.SystemServiceRegistryCompat.Class(SystemServiceRegistryCompat.java:17) at pw.qlm.inputmethodholder.compat.SystemServiceRegistryCompat.getSystemFetcher(SystemServiceRegistryCompat.java:23) at pw.qlm.inputmethodholder.hook.InputMethodManagerHook.clearCachedService(InputMethodManagerHook.java:70) at pw.qlm.inputmethodholder.hook.InputMethodManagerHook.onHook(InputMethodManagerHook.java:60) at pw.qlm.inputmethodholder.InputMethodHolder.init(InputMethodHolder.java:41) at pw.qlm.sample.MyApplication.attachBaseContext(MyApplication.java:18) at android.app.Application.attach(Application.java:181) at android.app.Instrumentation.newApplication(Instrumentation.java:991) at android.app.Instrumentation.newApplication(Instrumentation.java:975) at android.app.LoadedApk.makeApplication(LoadedApk.java:502) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4301) at android.app.ActivityThread.access$1500(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NoClassDefFoundError: android/app/SystemServiceRegistry at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:251) at java.lang.Class.forName(Class.java:216) at pw.qlm.inputmethodholder.compat.SystemServiceRegistryCompat.Class(SystemServiceRegistryCompat.java:17) at pw.qlm.inputmethodholder.compat.SystemServiceRegistryCompat.getSystemFetcher(SystemServiceRegistryCompat.java:23) at pw.qlm.inputmethodholder.hook.InputMethodManagerHook.clearCachedService(InputMethodManagerHook.java:70) at pw.qlm.inputmethodholder.hook.InputMethodManagerHook.onHook(InputMethodManagerHook.java:60) at pw.qlm.inputmethodholder.InputMethodHolder.init(InputMethodHolder.java:41) at pw.qlm.sample.MyApplication.attachBaseContext(MyApplication.java:18) at android.app.Application.attach(Application.java:181) at android.app.Instrumentation.newApplication(Instrumentation.java:991) at android.app.Instrumentation.newApplication(Instrumentation.java:975) at android.app.LoadedApk.makeApplication(LoadedApk.java:502) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4301) at android.app.ActivityThread.access$1500(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassNotFoundException: Didn't find class "android.app.SystemServiceRegistry" on path: DexPathList[[zip file "/data/app/pw.qlm.softinputmethodlistener-1.apk"],nativeLibraryDirectories=[/data/app-lib/pw.qlm.softinputmethodlistener-1, /vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:497) at java.lang.ClassLoader.loadClass(ClassLoader.java:457) at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:251) at java.lang.Class.forName(Class.java:216) at pw.qlm.inputmethodholder.compat.SystemServiceRegistryCompat.Class(SystemServiceRegistryCompat.java:17) at pw.qlm.inputmethodholder.compat.SystemServiceRegistryCompat.getSystemFetcher(SystemServiceRegistryCompat.java:23) at pw.qlm.inputmethodholder.hook.InputMethodManagerHook.clearCachedService(InputMethodManagerHook.java:70) at pw.qlm.inputmethodholder.hook.InputMethodManagerHook.onHook(InputMethodManagerHook.java:60) at pw.qlm.inputmethodholder.InputMethodHolder.init(InputMethodHolder.java:41) at pw.qlm.sample.MyApplication.attachBaseContext(MyApplication.java:18) at android.app.Application.attach(Application.java:181) at android.app.Instrumentation.newApplication(Instrumentation.java:991) at android.app.Instrumentation.newApplication(Instrumentation.java:975) at android.app.LoadedApk.makeApplication(LoadedApk.java:502) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4301) at android.app.ActivityThread.access$1500(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) 06-19 10:25:56.731 12910-1
比如有一个悬浮球的需求,当弹出输入框的时候,将悬浮球顶上去,不要遮挡输入框
谢谢大佬,这个挺好用的,上次搞键盘监听好麻烦的。
我发现输入法启动的时候,会回调IInputMethodManagerService中的windowGainedFocus该方法,这个方法中会创建EditText和InputMethodService的通道,即IInputConnectionWrapper,在创建这个Binder的过程中,需要参数InputConnection对象,而这里是可以hook住的。这样键盘收起的时候就可以监听到了。测试6.0可以检测到,不知道对于完善你的Hook是否有帮助,麻烦了。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.