You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
    
  • 动态注册(推荐系统应用使用):在代码中直接注册广播,避免静态注册的限制:
    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 12+ 系统应用需确保拥有系统级权限(如android.permission.MANAGE_USB),否则可能仍无法接收广播。

二、不依赖广播的轮询方案

若广播方式不可行,可通过定时轮询UsbManager的设备列表,对比前后设备集合识别新增设备:

  1. 维护已发现设备的标识集合:
    private Set<String> knownDeviceSignatures = new HashSet<>();
    private UsbManager usbManager;
    
  2. 初始化时加载已有设备:
    usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    refreshKnownDevices();
    
  3. 定时检查新增设备(可使用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:

  1. 获取存储卷的diskId:
    StorageVolume usbVolume = ...; // 你的可移除存储卷对象
    String diskId = usbVolume.getDiskId(); // 格式通常为"usb:xxxx"
    
  2. 遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:06:00