Android TV开发:如何获取刚连接USB设备的serialNumber
获取Android TV刚连接USB设备SerialNumber的解决方案
一、修复USB_DEVICE_ATTACHED广播接收问题
系统应用无法接收该广播,通常是注册配置或权限问题,可按以下方式调整:
- 静态注册(Manifest配置):添加必要权限和意图过滤器,同时针对存储设备补充媒体挂载广播:
<uses-permission android:name="android.permission.USB_PERMISSION" /> <receiver android:name=".UsbAttachedReceiver"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <data android:scheme="file" /> </intent-filter> </receiver> - 动态注册(推荐系统应用使用):在代码中直接注册广播,避免静态注册的限制:
注:Android 12+ 系统应用需确保拥有系统级权限(如private BroadcastReceiver usbAttachedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { UsbDevice newDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (newDevice != null) { String serialNumber = newDevice.getSerialNumber(); // 处理获取到的serialNumber } } } }; // 在Activity/Fragment的onCreate中注册 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addDataScheme("file"); registerReceiver(usbAttachedReceiver, filter); } // 记得在onDestroy中注销 @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(usbAttachedReceiver); }android.permission.MANAGE_USB),否则可能仍无法接收广播。
二、不依赖广播的轮询方案
若广播方式不可行,可通过定时轮询UsbManager的设备列表,对比前后设备集合识别新增设备:
- 维护已发现设备的标识集合:
private Set<String> knownDeviceSignatures = new HashSet<>(); private UsbManager usbManager; - 初始化时加载已有设备:
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); refreshKnownDevices(); - 定时检查新增设备(可使用Handler或WorkManager实现定时任务):
private void detectNewUsbDevices() { HashMap<String, UsbDevice> currentDevices = usbManager.getDeviceList(); for (UsbDevice device : currentDevices.values()) { // 用deviceId+vendorId+productId生成唯一标识,避免重复识别 String deviceSignature = String.format("%d:%d:%d", device.getDeviceId(), device.getVendorId(), device.getProductId()); if (!knownDeviceSignatures.contains(deviceSignature)) { // 识别到刚连接的设备 String serialNumber = device.getSerialNumber(); // 处理serialNumber knownDeviceSignatures.add(deviceSignature); } } } private void refreshKnownDevices() { knownDeviceSignatures.clear(); HashMap<String, UsbDevice> devices = usbManager.getDeviceList(); for (UsbDevice device : devices.values()) { String deviceSignature = String.format("%d:%d:%d", device.getDeviceId(), device.getVendorId(), device.getProductId()); knownDeviceSignatures.add(deviceSignature); } }
三、U盘与UsbDevice的关联方法
针对U盘,可通过你已实现的StorageVolume逻辑,关联到对应的UsbDevice:
- 获取存储卷的diskId:
StorageVolume usbVolume = ...; // 你的可移除存储卷对象 String diskId = usbVolume.getDiskId(); // 格式通常为"usb:xxxx" - 遍历UsbManager设备列表匹配:
HashMap<String, UsbDevice> devices = usbManager.getDeviceList(); for (UsbDevice device : devices.values()) { // 通过diskId中的设备ID片段匹配 if (diskId.contains(String.valueOf(device.getDeviceId()))) { String serialNumber = device.getSerialNumber(); // 找到对应U盘的UsbDevice break; } }
内容的提问来源于stack exchange,提问作者LAKSHYA AGARWAL
相关产品推荐
相关产品推荐

