分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
项目中需要区分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 deviceList = manager.getDeviceList(); Iterator 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组织是有规定的,见:http://www.usb.org/
比如:
Base Class |
Descriptor Usage |
Description |
00h |
Device |
Use class information in the Interface Descriptors |
01h |
Interface |
Audio |
02h |
Both |
Communications and CDC Control |
03h |
Interface |
HID (Human Interface Device) |
05h |
Interface |
Physical |
06h |
Interface |
Image |
07h |
Interface |
Printer |
在kernel中,有两个结构体的相关成员表征USB设备的类型,第一个usb_device_descriptor:
Base Class |
Descriptor Usage |
Description |
00h |
Device |
Use class information in the Interface Descriptors |
就在第二个结构体usb_interface_descriptor中:
比如,对于USB打印机设备,定义如下:
HAL层的usbhost.c文件为我们获取Linux driver中USB设备的信息提供了便利,除了USB设备类型,还可以得到USB设备的厂商名称、产品名称、序列号等:
system/core/libusbhost/usbhost.c
usbhost.c该文件中提供的方法在JNI中调用:
frameworks/base/services/jni/com_android_server_UsbHostManager.cpp
上面代码截图信息量很大!很重要!很重要!很重要!很重要!重要的地方说四遍。
1、调用usbhost.c文件中方法获取USB设备信息
2、获取的信息一部分传到UsbInterface.java,APP部分调用UsbInterface类获取信息
USB设备属于热插拔设备,一旦系统监测到其热插拔时间,会有相应事件上报:
Android流程:driver->HAL->Framework->APP,几乎所有模块都是这个模式,对于一个外设,如果这几个部分都清楚的话心里会特别明亮。
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow