Android USB Host 使用详解(U盘)(一)
来源:互联网 发布:seo工作职责 编辑:程序博客网 时间:2024/05/22 09:59
首先说一下为什么要写关于Android USB Host通信的介绍,对于Android程序原来说不懂硬件做USB通信确实开头比较难,但是Google API介绍还是很详细的,而且网上也有很多例子,不过网上的基本把介绍和例子分开,光介绍不给例子,给个例子又不知道它是干什么的或者运行不了。那么我把自己通过阅读别人的博客和USB通信协议等来做下面的介绍,并给出一个通用的例子。
Android USB Host分以下三部份介绍:
(一)参考官方文档,查看USB设备信息。
(二)USB Host 相关API简介。
(三)给出一个U盘操作的例子。
Android USB Host使用详解之一:查看USB设备信息
首先来看一下Google的官方文档中关于Android USB的介绍:Android USB Host and Accessory
Android USB有两种模式Host Mode和Accessory Mode:
在Host Mode下,Android手机作为主设备,如通过OTG线连接的HID设备或者U盘为从设备;在Accessory Mode下,Android手机作为从设备,如通过USB数据线连接的电脑为主设备。
本文主要介绍在Host Mode下,Android手机与USB设备之间的通信。Android USB Host的介绍可参见Google 官方文档:Android USB Host介绍
关于Android USB相关类的介绍留在下面慢慢展开,先编写一个Android程序:
1)在AndroidManifest.xml文件中添加
<uses-feature android:name="android.hardware.usb.host" /><uses-sdk android:minSdkVersion="12" />有可能你在其它地方看见这样的写法
<uses-feature android:name="android.hardware.usb.host" android:required="true"/>本人建议不要这样写,因为这样写的话可能在/system/etc/permissions目录下不能自动创建android.hardware.usb.host.xml文件,而需要手动创建。
2)在<activity ...>添加
<intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /></intent-filter><meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />在res/xml文件夹下新建device_filter.xml
<resources> <usb-device vendor-id="3544" product-id="8199" /> <usb-device vendor-id="5251" product-id="4608" /></resources>其中vendor-id和product-id为插入USB设备的生产厂家号和产品号,但插入(attached)上面列出的设备之一时就会弹出选择打开应用程序的对话框。注:上面的id为10进制的,而通过电脑上查看的id为16进制的。
3)获取所有已连接上的USD设备的信息
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); UsbManager mManager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = mManager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); String info = new String(); while (deviceIterator.hasNext()) { UsbDevice device = deviceIterator.next(); info += "Device Name:" + device.getDeviceName() + "\n"; info += "Device ID:" + device.getDeviceId() + "\n"; info += "Device Class:" + device.getDeviceClass() + "\n"; info += "Device Protocl:" + device.getDeviceProtocol() + "\n"; info += "Device Vendor ID:" + device.getVendorId() + "\n"; info += "Device Product ID:" + device.getProductId() + "\n"; info += "Device Interface Count:" + device.getInterfaceCount() + "\n\n"; // Get interface details for (int index = 0; index < device.getInterfaceCount(); index++) { UsbInterface mUsbInterface = device.getInterface(index); info += "Interface " + index + ":\n"; info += "Interface ID:" + mUsbInterface.getId() + "\n"; info += "Inteface class:" + mUsbInterface.getInterfaceClass() + "\n"; info += "Interface protocol:" + mUsbInterface.getInterfaceProtocol() + "\n"; info += "Endpoint count:" + mUsbInterface.getEndpointCount() + "\n\n"; // Get endpoint details for (int epi = 0; epi < mUsbInterface.getEndpointCount(); epi++) { UsbEndpoint mEndpoint = mUsbInterface.getEndpoint(epi); info += "Endpoint " + epi + ":\n"; info += "Attributes: " + mEndpoint.getAttributes() + "\n"; info += "Direction: " + mEndpoint.getDirection() + "\n"; info += "Number: " + mEndpoint.getEndpointNumber() + "\n"; info += "Interval: " + mEndpoint.getInterval() + "\n"; info += "Packet size: " + mEndpoint.getMaxPacketSize() + "\n"; info += "Type: " + mEndpoint.getType() + "\n\n"; } } } TextView textView = (TextView)findViewById(R.id.info); textView.setText(info); }}
通过上面这段代码可以获得USB设备的所有信息,包括接口(interface)和端点(endpoint)的信息,只有了解设备的类型才能在后面进行通信。注:本人在测试时即使没有连接设备也会有显示一个设备,这个设备即使删除它后系统也会自动生成,这里不用管它,之后把它过滤掉就可以了。
测试结果如下:
上面左图为第一个设备(无对应设备,懂的大神可以解释一下),右图为连接的U盘。Device Name 的值是一个文件路径,在路径下可以看到相应的文件,插入设备时自动生成,拔出时自动删除,懂Linux的应该明白原理,我是不懂,所以就不解释了。
源码下载链接:源码链接
下面一篇将介绍Android USB相应类和API。
- Android USB Host 使用详解(U盘)(一)
- Android USB Host 使用详解(U盘)(二)
- Android USB Host 使用详解(U盘)(三)
- Android USB Host 使用详解(U盘)
- Android USB Host U盘
- Android USB Host使用详解
- Android USB Host的使用详解
- Android USB Host的使用详解
- Android USB Host的使用详解
- Android USB Host的使用详解
- Android USB Host的使用详解
- USB学习总结2—USB host设备驱动实现(U盘、鼠标)
- 图文详解使用Universal USB Installer制作usb闪盘(U盘)linux系统安装盘
- Linux下USB驱动详解(HOST)
- android-USB Host and Accessory(附加)
- usb-host一步一步学(一)安卓在usb-host模式下列出当前连接的usb设备
- android usb otg模式转换成host模式(不使用otg线连接,只用普通usb四线连接)
- AT91AM9200 USB HOST开发(一)—— 前言
- IntelliJ Idea配置JRebel启动失败Caused by: java.lang.NoSuchFieldError: a
- 对象引用与对象的区别
- 第一个个人项目
- 父母已老,请多包容!
- R语言 读取图像
- Android USB Host 使用详解(U盘)(一)
- WSAEventSelect模型编程
- hdu 1047 Integer Inquiry(大整数求和)
- 超强JSP防SQL注入攻击
- POJ 1887 Testing the CATCHER(LIS的反面 最大递减子序列)
- 编译hadoop2.2.0的eclipse插件流程总结
- VC下获取系统时间
- ORACLE 游标遍历
- 【HDU】病毒侵袭(AC自动机模板题)