遇到需要监测USB键盘的问题,搜集了一些方法做总结。


1. 使用BroadcastReceiver监听系统广播

[java]  view plain  copy
  1. private void detectUsbWithBroadcast() {  
  2.     Log.d(TAG, "listenUsb: register");  
  3.     IntentFilter filter = new IntentFilter();  
  4.     filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);  
  5.     filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);  
  6.     filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);  
  7.     filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);  
  8.     filter.addAction("android.hardware.usb.action.USB_STATE");  
  9.   
  10.     registerReceiver(mUsbStateChangeReceiver, filter);  
  11.     Log.d(TAG, "listenUsb: registered");  
  12. }  
  13.   
  14. private BroadcastReceiver mUsbStateChangeReceiver = new BroadcastReceiver() {  
  15.     @Override  
  16.     public void onReceive(Context context, Intent intent) {  
  17.         Log.d(TAG, "onReceive: " + intent.getAction());  
  18.     }  
  19.   
  20. };  

2. 使用InputManager检测输入设备

[java]  view plain  copy
  1. private void detectUsbDeviceWithInputManager() {  
  2.     InputManager im = (InputManager) getSystemService(INPUT_SERVICE);  
  3.     int[] devices = im.getInputDeviceIds();  
  4.     for (int id : devices) {  
  5.         InputDevice device = im.getInputDevice(id);  
  6.           Log.d(TAG, "detectUsbDeviceWithInputManager: " + device.getName());  
  7.         //do something  
  8.     }  
  9. }  

3. 使用Configuration

[java]  view plain  copy
  1. private void detectUsbKeyboardWithConfig() {  
  2.     Configuration config = getResources().getConfiguration();  
  3.     if (config.keyboard == Configuration.KEYBOARD_NOKEYS) {  
  4.         Log.i(TAG, "detectUsbKeyboardWithConfig: config: no keyboard");  
  5.     } else {  
  6.         Log.i(TAG, "detectUsbKeyboardWithConfig: config: has keyboard: " + config.keyboard);  
  7.     }  
  8. }  

4. 使用UsbManager

[java]  view plain  copy
  1. private void detectUsbDeviceWithUsbManager() {  
  2.     HashMap deviceHashMap = ((UsbManager) getSystemService(USB_SERVICE)).getDeviceList();  
  3.   
  4.     for (Map.Entry entry : deviceHashMap.entrySet()) {  
  5.         Log.d(TAG, "detectUsbDeviceWithUsbManager: " + entry.getKey() + ", " + entry.getValue());  
  6.     }  
  7. }  

5. 调用Linux命令

[java]  view plain  copy
  1. private void detectInputDeviceWithShell() {  
  2.     try {  
  3.         //获得外接USB输入设备的信息  
  4.         Process p = Runtime.getRuntime().exec("cat /proc/bus/input/devices");  
  5.         BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
  6.         String line = null;  
  7.         while ((line = in.readLine()) != null) {  
  8.             String deviceInfo = line.trim();  
  9.             //对获取的每行的设备信息进行过滤,获得自己想要的。  
  10.               if (deviceInfo.contains("Name="))  
  11.                 Log.d(TAG, "detectInputDeviceWithShell: " + deviceInfo);  
  12.         }  
  13.         Log.d(TAG, "-----------------------");  
  14.     } catch (Exception e) {  
  15.         e.printStackTrace();  
  16.     }  
  17. }  

对于usb键盘,以上2、5两种方法是行之有效的,其他的并不能检测到,具体原因不明。

根据网上所说,Linux下USB设备分为字符设备和块设备,而键盘属于字符设备,U盘属于块设备,或许是因为这个原因导致二者的差别?

原文地址:https://blog.csdn.net/zengsidou/article/details/78213926

更多相关文章

  1. 安卓APP:利用AndroidStudio开发usb串口通信软件【第2步】
  2. Android(安卓)-BLE蓝牙小DEMO
  3. android强制隐藏软键盘以及取消EditText的焦点
  4. android 压缩图片、生成缩略图 和转换Base64格式的字符串
  5. Android下获取设备唯一标识(UDID, DeviceID...)
  6. 通过设置android:imeOptions来改变软键盘Enter键图标
  7. [Android(安卓)学习笔记] 判断 Android(安卓)设备是否为模拟器
  8. Android设备定制为永不锁屏
  9. android 监听edittext addTextChangedListene

随机推荐

  1. Rooting the Cube U30GT rk3066 android
  2. 给Android标题栏加上返回按钮
  3. Android(安卓)EditText password example
  4. Android_Http交互
  5. Android(安卓)performing OAuth2 Authori
  6. 使用ExpandableListActivity实现可展开的
  7. android(15)(ContentProvider内容提供者)
  8. Android(安卓)屏蔽Home键
  9. ActionBar的移除与显示
  10. Android(安卓)跳转到系统应用管理