Android 检测 USB 连接

在现代智能设备中,USB(通用串行总线)是一个重要的连接方式,它允许数据传输和设备充电。在 Android 系统中,我们可以通过一系列的 API 和 BroadcastReceiver 来检测 USB 连接状态。本文将详细介绍如何在 Android 应用中实现 USB 连接检测,并提供相应的代码示例。

USB 连接的基本概念

在探讨如何检测 USB 连接之前,让我们先了解一下 USB 的基本类型:

  • ** USB Host**:指设备能够作为主机连接到其他 USB 设备的功能,例如连接 USB 存储设备、鼠标和键盘。
  • ** USB Accessory**:指外部设备能通过 USB 与 Android 设备进行通信。

在 Android 应用中,我们主要关注的就是 USB Host 的连接状态。

Android 中检测 USB 连接

检测 USB 连接的方式主要通过监听系统的广播(Broadcast)的形式实现。当 USB 状态发生改变时,系统会发送相应的广播。我们可以创建一个 BroadcastReceiver 来处理这些广播事件。

步骤一:添加权限

AndroidManifest.xml 文件中,您需要声明 USB 权限如下:

<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.USB_PERMISSION" />

步骤二:编写 BroadcastReceiver

接下来,我们创建一个 BroadcastReceiver 来监听 USB 连接和断开的事件:

public class UsbReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            // USB 设备插入
            UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if (device != null) {
                Log.d("UsbReceiver", "USB Device Attached: " + device.getDeviceName());
                // 在这里处理连接到的 USB 设备
            }
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            // USB 设备拔出
            UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if (device != null) {
                Log.d("UsbReceiver", "USB Device Detached: " + device.getDeviceName());
                // 在这里处理拔出的 USB 设备
            }
        }
    }
}

步骤三:注册 BroadcastReceiver

在您的活动或服务中,注册这个 BroadcastReceiver

public class MainActivity extends AppCompatActivity {
    private UsbReceiver usbReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        usbReceiver = new UsbReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        registerReceiver(usbReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(usbReceiver); // 取消注册
    }
}

类图分析

下面是类图的示例,展示了 MainActivityUsbReceiver 的关系。

classDiagram
    class MainActivity {
        +onCreate()
        +onDestroy()
    }

    class UsbReceiver {
        +onReceive(Context, Intent)
    }

    MainActivity --> UsbReceiver : uses

示例代码包含 USB 设备的更多信息

除了基本的连接处理外,您可能还希望获取 USB 设备的更多信息,例如设备类、设备接口等。下面是一个增强的 onReceive 方法示例:

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
        UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        if (device != null) {
            Log.d("UsbReceiver", "USB Device Attached: " + device.getDeviceName());
            Log.d("UsbReceiver", "Device Class: " + device.getDeviceClass());
            Log.d("UsbReceiver", "Vendor ID: " + device.getVendorId());
            Log.d("UsbReceiver", "Product ID: " + device.getProductId());
            // 处理连接设备
        }
    } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
        UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        if (device != null) {
            Log.d("UsbReceiver", "USB Device Detached: " + device.getDeviceName());
            // 处理拔出设备
        }
    }
}

结论

通过本文的介绍,我们学习了在 Android 应用中检测 USB 连接及断开的基本方法。我们使用了 BroadcastReceiver 来监听 USB 设备的插入和拔出事件,并获取设备的信息。这些知识对于开发需要与外部 USB 设备进行交互的应用程序非常重要。

希望这篇文章能帮助你更深入地了解 Android 中的 USB 连接检测!如有疑问或建议,请随时在评论区留言。