0

原来功能是开启一个服务,服务中开启一个透明的activity记录用户的操作步骤

IBinder wmbinder = ServiceManager.getService(Context.WINDOW_SERVICE);
mWindowManager = IWindowManager.Stub.asInterface(wmbinder);

获取到 IWindowManager.aidl 后调用里面的monitorInputExternal(String InputChannelName) 方法(如下)生成一个InputChannel name(client)
这里记为 方法1

mInputChannel = mWindowManager.monitorInputExternal(name);

但是到P版本后 方法1 在aidl里被删除
这个IWindowManager.aidl里面只提供了monitorSideTouchInputExternal(String InputChannelName) 方法

这里记为 方法2

mInputChannel = mWindowManager.monitorSideTouchInputExternal(name);

这样在继承了InputEventReceiver 自定义类里的onInputEvent() 方法只能响应回调侧边栏(P版本的手机有侧边栏的功能)的触摸事件 主屏幕界面的触摸事件不会去回调这个方法

但是方法1最终调用的方法monitorInput(String inputChannelName)在源码 InputManagerService.java 中可以找到(framework.jar中没有这个类, 通过其他办法得到的server.jar), 获取到这个调用这个方法的话方法中调用了native方法 nativeRegisterInputChannel(mPtr, inputChannels[0], null, true);

会报如下错误
java.lang.UnsatisfiedLinkError: No implementation found for long com.android.server.input.InputManagerService.nativeInit...

怎么处理这种情况 或者怎么在代码里调用系统的native方法

撰写答案