对于usb手柄而言,调用后会将/dev/input/eventX设备remove掉(getevent将不会接收到任何该usb设备的输入事件)
frameworks/base/core/jni/android_hardware_UsbDeviceConnection.cpp
static jboolean android_hardware_UsbDeviceConnection_claim_interface(JNIEnv *env, jobject thiz, int interfaceID, jboolean force) { struct usb_device* device = get_device_from_object(env, thiz); if (!device) { ALOGE("device is closed in native_claim_interface"); return -1; } int ret = usb_device_claim_interface(device, interfaceID); if (ret && force && errno == EBUSY) { // disconnect kernel driver and try again usb_device_connect_kernel_driver(device, interfaceID, false); ret = usb_device_claim_interface(device, interfaceID); } return ret == 0; }
system/core/libusbhost/usbhost.c
int usb_device_claim_interface(struct usb_device *device, unsigned int interface) { return ioctl(device->fd, USBDEVFS_CLAIMINTERFACE, &interface); } int usb_device_connect_kernel_driver(struct usb_device *device, unsigned int interface, int connect) { struct usbdevfs_ioctl ctl; ctl.ifno = interface; ctl.ioctl_code = (connect ? USBDEVFS_CONNECT : USBDEVFS_DISCONNECT); ctl.data = NULL; return ioctl(device->fd, USBDEVFS_IOCTL, &ctl); }