Android 檢測和監聽當前USB設備VID/PID


在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,此時系統初始化未完成,會造成無法開機!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM