能否获取连接Android设备的硬件键盘信息?UsbManager查询无结果
提取硬件键盘的设备信息(序列号、名称等)
完全可以提取硬件键盘的序列号、名称等信息,你遇到的UsbManager返回空列表问题,主要是权限配置和设备过滤的细节没处理到位,以下是具体解决方法:
修复UsbManager返回空列表的问题
硬件键盘属于USB HID类设备,你需要确保:- 申请并获取USB设备访问权限
- 正确筛选HID类型的设备
示例代码:
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); for (UsbDevice device : deviceList.values()) { // 筛选HID类设备(硬件键盘归为此类) if (device.getDeviceClass() == UsbConstants.USB_CLASS_HID) { // 提取设备信息 String deviceName = device.getDeviceName(); String serialNumber = device.getSerialNumber(); int vendorId = device.getVendorId(); int productId = device.getProductId(); // 这里可以对获取到的信息进行处理 } }权限配置要点
即使能检测到连接状态,读取设备详细信息也需要用户授权:- 在Manifest中添加权限:
<uses-permission android:name="android.permission.USB_PERMISSION" /> - 针对Android 6.0+动态申请权限,或者发送广播请求用户授权:
if (!usbManager.hasPermission(device)) { PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.your.package.USB_PERMISSION"), 0); usbManager.requestPermission(device, permissionIntent); } - 可选:通过xml配置设备过滤规则,让系统自动识别键盘设备
在res/xml/usb_device_filter.xml中添加:
然后在Manifest的activity中关联该配置:<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 匹配键盘类型的HID设备 --> <usb-device class="0x03" subclass="0x01" protocol="0x01" /> </resources><activity ...> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" /> </activity>
- 在Manifest中添加权限:
为什么能检测连接但列表为空
系统的USB连接/断开广播(如ACTION_USB_DEVICE_ATTACHED)不需要特殊权限就能接收,但要让UsbManager返回该设备并读取其信息,必须获得对应USB设备的访问权限,否则设备不会出现在可访问列表中。
内容的提问来源于stack exchange,提问作者Itamar Bitton
相关产品推荐
相关产品推荐

