输入界面驱动程序
输入用户驱动程序为应用程序提供了将事件注入到Android 输入管道 中的界面。使用此API,应用程序可以模拟人机接口设备(HID)或使用 外设I / O 将外部硬件连接到输入系统。
主要活动
关键事件表明输入开关的瞬间按下和释放。它们通常用于通用按钮输入(例如音量键,媒体播放键)和键盘的键。 Android将每个事件表示为 KeyEvent 实例。
- 使用
InputDriver.Builder
和源类型SOURCE_CLASS_BUTTON
创建一个新的驱动程序实例。 -
用
UserDriverManager
注册驱动程序。import com.google.android.things.userdriver.InputDriver; import com.google.android.things.userdriver.UserDriverManager; ... public class ButtonDriverService extends Service { // Driver parameters private static final String DRIVER_NAME = "EscapeButton"; private static final int DRIVER_VERSION = 1; // Key code for driver to emulate private static final int KEY_CODE = KeyEvent.KEYCODE_ESCAPE; private InputDriver mDriver; @Override public void onCreate() { super.onCreate(); // Create a new driver instance mDriver = InputDriver.builder(InputDevice.SOURCE_CLASS_BUTTON) .setName(DRIVER_NAME) .setVersion(DRIVER_VERSION) .setKeys(new int[] {KEY_CODE}) .build(); // Register with the framework UserDriverManager manager = UserDriverManager.getManager(); manager.registerInputDriver(mDriver); } @Override public IBinder onBind(Intent intent) { return null; } }
-
当发生硬件事件时,使用当前密钥代码和输入操作为每个状态的更改构造一个新的
KeyEvent
。 -
使用
emit()
方法将事件注入到驱动程序中。public class ButtonDriverService extends Service { ... // A state change has occurred private void triggerEvent(boolean pressed) { int action = pressed ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP; KeyEvent[] events = new KeyEvent[] {new KeyEvent(action, KEY_CODE)}; if (!mDriver.emit(events)) { Log.w(TAG, "Unable to emit key event"); } } }
-
当不需要关键事件时,取消注册该驱动程序。
public class ButtonDriverService extends Service { ... @Override public void onDestroy() { super.onDestroy(); UserDriverManager manager = UserDriverManager.getManager(); manager.unregisterInputDriver(mDriver); } }
运动事件
输入驱动器也可以发射运动事件以将指点设备连接到框架,例如触摸板或鼠标。这些设备将绝对位置值作为x / y坐标进行报告。每个事件都包括一个可选的按钮状态,以指示该事件是否表示该位置的“点击”或“点击”事件。
InputDriver.Builder
和源类型 SOURCE_TOUCHPAD
创建一个新的驱动程序实例。用 UserDriverManager
注册驱动程序。
import com.google.android.things.userdriver.InputDriver;
...
public class TouchpadDriverService extends Service {
// Driver parameters
private static final String DRIVER_NAME = "Touchpad";
private static final int DRIVER_VERSION = 1;
private InputDriver mDriver;
@Override
public void onCreate() {
super.onCreate();
mDriver = InputDriver.builder(InputDevice.SOURCE_TOUCHPAD)
.setName(DRIVER_NAME)
.setVersion(DRIVER_VERSION)
.setAbsMax(MotionEvent.AXIS_X, 255)
.setAbsMax(MotionEvent.AXIS_Y, 255)
.build();
UserDriverManager manager = UserDriverManager.getManager();
manager.registerInputDriver(mDriver);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
当发生硬件事件时,使用emit()
方法将新坐标注入到驱动程序中。
public class TouchpadDriverService extends Service {
...
// A state change has occurred
private void triggerEvent(int x, int y, boolean pressed) {
if (!mDriver.emit(x, y, pressed)) {
Log.w(TAG, "Unable to emit motion event");
}
}
}
当不需要指针事件时,取消注册驱动程序。
public class TouchpadDriverService extends Service {
...
@Override
public void onDestroy() {
super.onDestroy();
UserDriverManager manager = UserDriverManager.getManager();
manager.unregisterInputDriver(mDriver);
}
}
处理输入事件
Android通过各种回调方法向前台活动提供输入事件。您的应用程序通过 onKeyDown()
和 onKeyUp()
方法以及所有其他输入事件通过 onGenericMotionEvent()
方法接收关键事件。
public class HomeActivity extends Activity {
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Handle key pressed and repeated events
return true;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// Handle key released events
return true;
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
// Handle motion input events
return true;
}
}
有关Android如何处理来自外部源设备的输入事件的详细信息,请参阅 Handling Controller Actions。