Android USB 通信开发

Android USB 通信开发主要涉及两种模式:主机模式(Host Mode)和配件模式(Accessory Mode)。以下是开发USB通信应用的关键知识点和步骤。

1. 基本概念

主机模式(Host Mode)

  • Android设备作为USB主机,控制连接的USB设备

  • 需要设备支持USB主机功能(通常需要OTG支持)

配件模式(Accessory Mode)

  • Android设备作为USB配件被其他主机控制

  • 需要设备支持USB配件模式

2. 开发准备

清单文件配置

XML 复制代码
<!-- 声明USB主机功能 -->
<uses-feature android:name="android.hardware.usb.host" />

<!-- 声明USB配件功能(如果需要) -->
<uses-feature android:name="android.hardware.usb.accessory" />

<!-- 添加必要的权限 -->
<uses-permission android:name="android.permission.USB_PERMISSION" />

3. USB主机模式开发

发现连接的USB设备

java 复制代码
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();

请求设备权限

java 复制代码
private static final String ACTION_USB_PERMISSION = "com.example.USB_PERMISSION";

PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, 
    new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE);

IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);

usbManager.requestPermission(device, permissionIntent);

广播接收器处理权限结果

java 复制代码
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(device != null){
                        // 权限已授予,可以通信
                        openDevice(device);
                    }
                } else {
                    Log.d(TAG, "权限被拒绝 for device " + device);
                }
            }
        }
    }
};

打开设备并通信

java 复制代码
private void openDevice(UsbDevice device) {
    UsbInterface intf = device.getInterface(0);
    UsbEndpoint endpoint = intf.getEndpoint(0);
    
    UsbDeviceConnection connection = usbManager.openDevice(device);
    if (connection == null) return;
    
    connection.claimInterface(intf, true);
    
    // 发送数据
    byte[] sendData = "Hello".getBytes();
    int sent = connection.bulkTransfer(endpoint, sendData, sendData.length, 0);
    
    // 接收数据
    byte[] receiveData = new byte[64];
    int received = connection.bulkTransfer(endpoint, receiveData, receiveData.length, 0);
}

4. USB配件模式开发

清单文件配置

java 复制代码
<activity ...>
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
    </intent-filter>
    <meta-data 
        android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
        android:resource="@xml/accessory_filter" />
</activity>

配件过滤器(xml/accessory_filter.xml)

XML 复制代码
<resources>
    <usb-accessory 
        manufacturer="YourCompany" 
        model="YourModel" 
        version="1.0" />
</resources>

检测配件连接

java 复制代码
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory[] accessoryList = usbManager.getAccessoryList();

if (accessoryList != null && accessoryList.length > 0) {
    UsbAccessory accessory = accessoryList[0];
    openAccessory(accessory);
}

打开配件通信

java 复制代码
private void openAccessory(UsbAccessory accessory) {
    ParcelFileDescriptor fd = usbManager.openAccessory(accessory);
    if (fd != null) {
        FileDescriptor fileDescriptor = fd.getFileDescriptor();
        FileInputStream inputStream = new FileInputStream(fileDescriptor);
        FileOutputStream outputStream = new FileOutputStream(fileDescriptor);
        
        // 现在可以通过输入输出流进行通信
    }
}

5. 常见问题

  1. 权限问题:确保正确请求和处理USB权限

  2. 设备兼容性:并非所有Android设备都支持USB主机模式

  3. 线程阻塞:USB通信可能阻塞UI线程,建议在后台线程进行

  4. 连接稳定性:处理USB设备插拔事件

6. 高级主题

  • USB串口通信:使用CDC(Communication Device Class)协议

  • HID设备通信:与键盘、鼠标等HID设备交互

  • 同步通信:使用控制传输(Control Transfer)和中断传输(Interrupt Transfer)

7. 推荐库

开发时请参考Android官方USB文档获取最新信息。

相关推荐
架构源启1 天前
文档接入与智能解析:基于 Spring AI 1.1.x 的多格式解析、版面理解与结构化抽取
java·人工智能·spring
大模型码小白1 天前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
名字还没想好☜1 天前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
音符犹如代码1 天前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉1 天前
手撕小汇总
java·前端·javascript
Xzaveir1 天前
不要用一个状态表示“号码已认证”:企业号码身份的四域模型
android·人工智能
唐青枫1 天前
Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
java
(Charon)1 天前
【C++】手写 MySQL 连接池(二):同步连接的获取、加锁与释放
android
脱胎换骨-军哥1 天前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
我是唐青枫1 天前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio