这就是 logcat 输出的内容,我已经用我自己的证书签署了我的 android apk
java.lang.NoSuchMethodException: com.example.receiver.InputManager.getInstance []
at java.lang.Class.getMethod(Class.java:2937)
at java.lang.Class.getDeclaredMethod(Class.java:2914)
at com.example.receiver.InputHandler.getInputManager(InputHandler.java:59)
at com.example.receiver.InputHandler.injectInputEvent(InputHandler.java:43)
at com.example.receiver.InputHandler.Handle(InputHandler.java:84)
at com.example.receiver.Main.main(Main.java:38)
at com.example.receiver.MainActivity.lambda$onCreate$0(MainActivity.java:21)
at com.example.receiver.MainActivity$$ExternalSyntheticLambda0.run(Unknown Source:2)
这是与injectInputEvent()相关的代码
private void injectInputEvent(MotionEvent event) {
try {
getInjectInputEvent().invoke(getInputManager(), event, 0);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
}
private static Method getInjectInputEvent() throws NoSuchMethodException {
Class<InputManager> cl = InputManager.class;
Method method = cl.getDeclaredMethod("injectInputEvent", InputEvent.class, int.class);
method.setAccessible(true);
return method;
}
private static InputManager getInputManager() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<InputManager> cl = InputManager.class;
Method method = cl.getDeclaredMethod("getInstance");
method.setAccessible(true);
return (InputManager) method.invoke(cl);
}
我在清单中设置了以下权限:
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
我从 adb shell 运行我的 apk,如下所示:
am start com.example.receiver/com.example.receiver.MainActivity
这应该有效,我认为它适用于 scrcpy 的服务器 为什么它不适合我的?
我没有 root 访问权限。
我期望应用程序能够 InjectInputEvents,但它不能。 我尝试从 adb shell 和 android studio 启动它,但没有任何区别。
Scrcpy 使用
adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.1 scid=12345678 log_level=info audio=false max_size=1920
以 shell 权限启动服务器。
am start
正常启动应用程序(用户权限)。
您可以尝试shizuku直接使用系统API。