输入界面驱动程序

输入用户驱动程序为应用程序提供了将事件注入到Android 输入管道 中的界面。使用此API,应用程序可以模拟人机接口设备(HID)或使用 外设I / O 将外部硬件连接到输入系统。

主要活动

关键事件表明输入开关的瞬间按下和释放。它们通常用于通用按钮输入(例如音量键,媒体播放键)和键盘的键。 Android将每个事件表示为 KeyEvent 实例。

  1. 使用 InputDriver.Builder 和源类型 SOURCE_CLASS_BUTTON 创建一个新的驱动程序实例。

  2. 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;
        }
    }
    
  3. 当发生硬件事件时,使用当前密钥代码和输入操作为每个状态的更改构造一个新的 KeyEvent

  4. 使用 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");
            }
        }
    }
    
  5. 当不需要关键事件时,取消注册该驱动程序。

    public class ButtonDriverService extends Service {
        ...
    
        @Override
        public void onDestroy() {
            super.onDestroy();
    
            UserDriverManager manager = UserDriverManager.getManager();
            manager.unregisterInputDriver(mDriver);
        }
    }
    

运动事件

输入驱动器也可以发射运动事件以将指点设备连接到框架,例如触摸板或鼠标。这些设备将绝对位置值作为x / y坐标进行报告。每个事件都包括一个可选的按钮状态,以指示该事件是否表示该位置的“点击”或“点击”事件。

  1. 使用 InputDriver.Builder 和源类型 SOURCE_TOUCHPAD 创建一个新的驱动程序实例。
  2. 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;
        }
    }
    
  3. 当发生硬件事件时,使用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");
            }
        }
    }
    
  4. 当不需要指针事件时,取消注册驱动程序。

    public class TouchpadDriverService extends Service {
        ...
    
        @Override
        public void onDestroy() {
            super.onDestroy();
    
            UserDriverManager manager = UserDriverManager.getManager();
            manager.unregisterInputDriver(mDriver);
        }
    }
    
  5. 处理输入事件

    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

    results matching ""

      No results matching ""