在APP中使用:
檢測當前連接設備是否有對應的VID/PID
private boolean isCurrentDeviceConnected(){ UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> usbList = manager.getDeviceList(); for(String key: usbList.keySet()){ UsbDevice usbDevice = usbList.get(key); if(usbDevice != null && usbDevice.getProductId() == 10304 && usbDevice.getVendorId() == 1060){ return true; } } return false; }
監聽USB設備插入和拔出
IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(mUsbStateChangeReceiver, filter);
private final BroadcastReceiver mUsbStateChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); UsbDevice usbDevice = (UsbDevice)intent.getExtras().get("device"); if(usbDevice != null && usbDevice.getProductId() == 10304 && usbDevice.getVendorId() == 1060){ if(action == UsbManager.ACTION_USB_DEVICE_ATTACHED){ }else if(action == UsbManager.ACTION_USB_DEVICE_DETACHED){ } } } };
在frameworks中使用:
需要修改frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
1. 在原來的 ACTION_USB_DEVICE_ATTACHED receiver中添加自己需要檢測的VID PID的代碼
BroadcastReceiver hostReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Iterator devices = ((UsbManager) context.getSystemService(Context.USB_SERVICE)) .getDeviceList().entrySet().iterator(); if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, true); if(need) { UsbDevice usbDevice = (UsbDevice)intent.getExtras().get("device"); if(usbDevice != null && usbDevice.getProductId() == CRADLE_MONITOR_PID && usbDevice.getVendorId() == CRADLE_MONITOR_VID) { handleCradleConnected(true); } } } else { mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, false); if(need) { UsbDevice usbDevice = (UsbDevice)intent.getExtras().get("device"); if(usbDevice != null && usbDevice.getProductId() == CRADLE_MONITOR_PID && usbDevice.getVendorId() == CRADLE_MONITOR_VID) { handleCradleConnected(false); } } } } };
2. 添加直接檢測當前是否已經連接的code
private boolean isCradleConnected(){ UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> usbList = manager.getDeviceList(); for(String key: usbList.keySet()){ UsbDevice usbDevice = usbList.get(key); if(usbDevice != null && usbDevice.getProductId() == CRADLE_MONITOR_PID && usbDevice.getVendorId() == CRADLE_MONITOR_VID){ return true; } } return false; }
3. 在MSG_BOOT_COMPLETED開機完成的message再去呼叫步驟2里面的function去做初始化檢測
注意:不能在UsbDeviceManager的構造函數里面去呼叫步驟2的function,此時系統初始化未完成,會造成無法開機!
