项目中需要区分USB的连接设备是打印机还是电子秤,然后上网搜索到了一篇博客,根据这个博客写的一个小的例子:非常感谢hao2014_的这篇博客http://blog.csdn.net/u013686019/article/details/50409421
MainActivity:
package com.example.administrator.usbmanagertest;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Iterator;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.sb);
}
public void showUsbList(View view) {
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
StringBuilder sb = new StringBuilder();
while (deviceIterator.hasNext()){
UsbDevice usbDevice = deviceIterator.next();
sb.append("DeviceName="+usbDevice.getDeviceName()+"\n");
sb.append("DeviceId="+usbDevice.getDeviceId()+"\n");
sb.append("VendorId="+usbDevice.getVendorId()+"\n");
sb.append("ProductId="+usbDevice.getProductId()+"\n");
sb.append("DeviceClass="+usbDevice.getDeviceClass()+"\n");
int deviceClass = usbDevice.getDeviceClass();
if(deviceClass==0) {
UsbInterface anInterface = usbDevice.getInterface(0);
int interfaceClass = anInterface.getInterfaceClass();
sb.append("device Class 为0-------------\n");
sb.append("Interface.describeContents()="+anInterface.describeContents()+"\n");
sb.append("Interface.getEndpointCount()="+anInterface.getEndpointCount()+"\n");
sb.append("Interface.getId()="+anInterface.getId()+"\n");
//http://blog.csdn.net/u013686019/article/details/50409421
//http://www.usb.org/developers/defined_class/#BaseClassFFh
//通过下面的InterfaceClass 来判断到底是哪一种的,例如7就是打印机,8就是usb的U盘
sb.append("Interface.getInterfaceClass()="+anInterface.getInterfaceClass()+"\n");
if(anInterface.getInterfaceClass()==7){
sb.append("此设备是打印机\n");
}else if(anInterface.getInterfaceClass()==8){
sb.append("此设备是U盘\n");
}
sb.append("anInterface.getInterfaceProtocol()="+anInterface.getInterfaceProtocol()+"\n");
sb.append("anInterface.getInterfaceSubclass()="+anInterface.getInterfaceSubclass()+"\n");
sb.append("device Class 为0------end-------\n");
}
sb.append("DeviceProtocol="+usbDevice.getDeviceProtocol()+"\n");
sb.append("DeviceSubclass="+usbDevice.getDeviceSubclass()+"\n");
sb.append("+++++++++++++++++++++++++++\n");
sb.append(" \n");
}
textView.setText(sb);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.usbmanagertest.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="showUsbList"
android:text="Show USB List" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:textSize="25sp"
android:id="@+id/sb"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
参考博客地址:
http://blog.csdn.net/u013686019/article/details/50409421
一、问题
现在有USB设备插入Android系统,那么如何得知插入的设备类型?是USB打印机,U盘,还是USB鼠标?
二、USB类型规定
对于USB类型,USB组织是有规定的,见:http://www.usb.org/
比如:
Base Class |
Descriptor Usage |
Description |
00h |
Device |
|
01h |
Interface |
|
02h |
Both |
|
03h |
Interface |
|
05h |
Interface |
|
06h |
Interface |
|
07h |
Interface |
三、Linux对USB设备类型定义
在kernel中,有两个结构体的相关成员表征USB设备的类型,第一个usb_device_descriptor:
bDeviceClass成员值区别不同的USB设备,如果该值为0呢?看上边:
Base Class |
Descriptor Usage |
Description |
00h |
Device |
就在第二个结构体usb_interface_descriptor中: