Android USB 通信开发主要涉及两种模式:主机模式(Host Mode)和配件模式(Accessory Mode)。以下是开发USB通信应用的关键知识点和步骤。
1. 基本概念
主机模式(Host Mode)
-
Android设备作为USB主机,控制连接的USB设备
-
需要设备支持USB主机功能(通常需要OTG支持)
配件模式(Accessory Mode)
-
Android设备作为USB配件被其他主机控制
-
需要设备支持USB配件模式
2. 开发准备
清单文件配置
<!-- 声明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设备
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
请求设备权限
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);
广播接收器处理权限结果
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);
}
}
}
}
};
打开设备并通信
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配件模式开发
清单文件配置
<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)
<resources>
<usb-accessory
manufacturer="YourCompany"
model="YourModel"
version="1.0" />
</resources>
检测配件连接
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory[] accessoryList = usbManager.getAccessoryList();
if (accessoryList != null && accessoryList.length > 0) {
UsbAccessory accessory = accessoryList[0];
openAccessory(accessory);
}
打开配件通信
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. 常见问题
-
权限问题:确保正确请求和处理USB权限
-
设备兼容性:并非所有Android设备都支持USB主机模式
-
线程阻塞:USB通信可能阻塞UI线程,建议在后台线程进行
-
连接稳定性:处理USB设备插拔事件
6. 高级主题
-
USB串口通信:使用CDC(Communication Device Class)协议
-
HID设备通信:与键盘、鼠标等HID设备交互
-
同步通信:使用控制传输(Control Transfer)和中断传输(Interrupt Transfer)
7. 推荐库
-
usb-serial-for-android:简化USB串口通信
-
libusb-android:提供更底层的USB访问
开发时请参考Android官方USB文档获取最新信息。