博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 检测和监听当前USB设备VID/PID
阅读量:7221 次
发布时间:2019-06-29

本文共 3610 字,大约阅读时间需要 12 分钟。

在APP中使用:

检测当前连接设备是否有对应的VID/PID

private boolean isCurrentDeviceConnected(){        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);        HashMap
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
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,此时系统初始化未完成,会造成无法开机!

转载于:https://www.cnblogs.com/kunkka/p/10805388.html

你可能感兴趣的文章
对象引论
查看>>
如何使用 JavaScript 解析 URL
查看>>
实现简单的正则表达式引擎
查看>>
React as a UI Runtime(五、列表)
查看>>
C语言笔记(第一章:C语言编程)
查看>>
翻译:Hystrix - How To Use
查看>>
前嗅ForeSpider教程:创建模板
查看>>
Redis在Web项目中的应用与实践
查看>>
JavaScript HTML DOM
查看>>
吐槽Javascript系列二:数组中的splice和slice方法
查看>>
HashMap剖析之内部结构
查看>>
什么是Javascript函数节流?
查看>>
【技术性】Search知识
查看>>
区块链共识机制优缺点对比都是什么
查看>>
如何进阶一名有竞争力的程序员?
查看>>
seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
查看>>
前端_面试
查看>>
Promise面试题,控制异步流程
查看>>
MQ框架的比较
查看>>
Spark in action on Kubernetes - Playground搭建与架构浅析
查看>>