android_USB_Host
- 格式:pdf
- 大小:235.92 KB
- 文档页数:8
Android中查看USB连接的外接设备信息的代码实例1,USB存储设备(如:U盘,移动硬盘)://USB存储设备插拔监听与 SD卡插拔监听⼀致。
复制代码代码如下:private USBBroadCastReceiver mBroadcastReceiver;IntentFilter iFilter = new IntentFilter();iFilter.addAction(Intent.ACTION_MEDIA_EJECT);iFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);iFilter.addAction(Intent.ACTION_MEDIA_REMOVED);iFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);iFilter.addDataScheme("file");mBroadcastReceiver = new USBBroadCastReceiver();registerReceiver(mBroadcastReceiver, iFilter);private class USBBroadCastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Intent.ACTION_MEDIA_EJECT)) {//USB设备移除,更新UI} else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {//USB设备挂载,更新UI}}}//获得挂载的USB设备的存储空间使⽤情况public static String getUSBStorage(Context context){// USB Storage//storage/udisk为USB设备在Android设备上的挂载路径.不同⼚商的Android设备路径不同。
CH341PAR Android JAR库接口说明版本: V1.00CH341PAR Android JAR库接口说明版本: 1简介CH341是一个USB总线的转接芯片,通过USB总线提供异步UART、并口、常用的2线和4线同步串行接口等方式。
并口方式下,提供了EPP/MEM 8位并行接口,而常用的同步串行接口主要包含2线IIC、4线SPI等。
本文档主要介绍CH341USB转EPP、MEM、IIC、SPI模式(以下简称CH341PAR)操作的Java Driver 库,以及Android下如何使用APK操作CH341PAR实现数据通讯。
该驱动基于Android USB Host协议完成,用户可调用所提供的相关接口API实现与Android USB Host的通讯。
CH341PAR提供的库需要满足以下两个条件方可实现数据通讯:1、Android 3.1及以上系统版本;2、Android端具有USB Host或OTG接口。
本文档将会重点说明Android USB Host与CH341建立通讯机制的Java包API以及我司提供的演示程序的操作说明。
关于Android USB Host协议说明,可以参考Google官方文档。
1、Android USB Host本文档所描述的演示程序皆是针对Android 3.1及以上版本系统。
Android 应用程序的启动参数是定义在device_filter.xml文件中的product-id和vendor-id。
基于CH341PAR开发的Android应用程序主要分为两个部分,如下图:图1.1 CH341PAR Android ApplicationUser Layout:主要是由用户根据自己的需求完成相关的代码,通过调用CH341PAR相关的接口函数实现EPP、MEM、IIC、SPI的通讯方式。
我司所提供的例程基于Fragment结构设计,在Android手机或平板上会呈现出不同的主界面。
Google ADK开发环境的搭建(USB HOST SHIELD + ARDUINO MEGA2560)By:MobotRoid 一、背景Google在今年5,6月份的时候更新Android到2.3.4开始支持外接扩展硬件,这里无疑为我们描绘了未来嵌入式智能的发展蓝图,在任何你需要智能计算的地方,可以是汽车里,可以是家庭智能计算中心,甚至可以在天文台都可以即时插入手机获取手机的计算资源.当然就目前来看最大的应用还是在机器人智能上.很久以前就一直萌生有自己做机器人的想法,苦于对数电模电单片机了解太粗浅,一直没能下手,这次ADK的开放可以说对于做软件的人来说是敞开了机器人的大门.因为ADK发布并不久,算是比较新的技术,网上的资源相对较少,特别是国内的资源更少,这里就我这段时间对ADK环境搭建的经验分享出来给大家.Google本身发布了一个专用于ADK的板子,要价400美刀,当然实际上用arduino + usb host shield(在淘宝上2560 + USB HOST SHIELD 2.0 只需要300人民币左右)也是可以达到的,虽然实际做起来有点曲折.二、相关文件的生成先附上google标准教程:(你严格按照这个做如果能完成最好,如果不能完成还是看我这个吧) /guide/topics/usb/adk.html你需要在这步产生两个文件,一个手机端用的apk以及一个用于上传到板子上的pde.严格按照谷歌官方的步骤走,第一步,下载googleADK包(https:///android/adk/adk_release_0512.zip)第二步,搭建android开发环境(网上一搜一把,我这里就不重复了), 通过SDK Manager下载Adds-on(Google APIs),如果手机就 2.3.3,level10,如果是pad就需要 3.0(安装图可以见/android/add-ons/google-apis/installing.html)第三步,在eclipse中,通过建立已存在工程的方式把ADK包中的\app工程建立出来,target选google API,或者2.3.3或者3.0,根据需要建立,建立完了以后,在工程下就会有bin文件夹产生了,下面那个apk就是我们要用的apk了第四步,下载arduino开发IDE(/en/Guide/HomePage),完了安装,之后将ADK包中的\firmware\arduino_libs下的两个文件夹拷贝到arduinoIDE安装目录下的\libraries中,然后打开IDE,从IDE中打开ADK包中的\firmware\demokit\demokit.pde,编译就行了通过第三步产生的apk传到手机,以及第四步的pde选择好对应的板子后传到板子上,我们就完成了google标准教程中的内容,如果你的apk能在手机上顺利安装,并且在板子连上打印线(用于供电,你也可以用电源线供电)后,USB HOST SHIELD连上手机时如果出现了警告窗口,恭喜你,剩下的内容你不用看了,你已经打通了手机和板子的通信,剩下的就是写你想要的功能了.如果APK没装成功,或者线连通了手机上没有出现警告窗口,接下来的内容可能会对你有些帮助.三、手机端开发环境的搭建手机端最硬性的条件是手机必须支持到android2.3.4以上的rom,从实际情况来说,即使G1也能刷到 2.3.4以后,所以理论上说所有的android手机都能支持(实际上根据老外研究貌似galaxy S系的手机不支持).我这里使用的就是很早期的HTC G2来做的.有可能你在按google标准做法做了以后,APK安装不上,LOG中显示Package com.google.android.DemoKit requires unavailable shared library b.accessory; failing!这需要你按照下面步骤进行测试和调整(1)关于rom1.如果你的手机通过官方升级渠道能够升级到 2.3.4以后恭喜你,你不用为rom发愁,什么都不做或者做一点拷贝工作就能完成手机端的布置.2.如果你的手机官方升级早已停滞(比如我用的HTC G2)那么你只能刷MOD版的rom,国内比较常见的可以去安卓网或者机锋网搜索你想要的rom,由于不是专门的开发网站,他们的rom比较有局限性,一般都是从国外的rom拉过来改的,国外比较权威的是xda论坛,一般的rom都能找到(/),刷机过程我这里就不赘述了,内容比较多,请不太清楚的读者转到安卓机锋网先学习一下.一般来说,MOD版的rom都有root权限,可以通过如下方式检查你的rom是否支持ADK,拉取根目录下/proc/config.gz出来,解压缩,搜索"CONFIG_USB_ANDROID_ACCESSORY",如果搜索不到或者搜索出来的结果是"# CONFIG_USB_ANDROID_ACCESSORY is not set"那很不幸,这个rom是不支持ADK的,需要再刷其他rom(以HTC G1或者G2这些早期版本来说,ezGingerBread的rom是支持的,但是安装后需要自己设置语言为中文,ezGingerBread的网址:/showthread.php?t=882356)(2)关于运行库以及权限Rom的问题解决后,可以尝试安装一下,很可能还是安装不上,是因为缺少运行库的原因,你可以把模拟器文件中/system/framework/下面的b.accessory.jar文件拷到手机的对应目录下,同时需要把/system/etc/permissions/目录下的b.accessory.xml拷贝到对应目录下,这个目录也被链接到/etc/permissions 的.(如果没有root提权需要用adb命令push文件),这里附上国外解决这个问题的原始链接: https:///ezterry/manifest-gingerbread-DS/issues/32经过这两步,按道理来说应该可以顺利安装上APK了,这时你可以尝试下把板子跟手机连一下观察是否有警告框弹出,如果没有,接着往下看四、ARDUINO端开发环境搭建非常恶心地,google原始提供的pde以及USB HOST SHIELD库并不支持目前市面上常见的USB HOST SHIELD,只需要做一个简单替换即可.先下载USB HOST SHIELD LIB 2.0,地址如下https:///felis/USB_Host_Shield_2.0/downloads解压将arduinoIDE目录下原来的USB_Host_Shield做个备份后删掉,然后将解压得到的目录重命名为USB_Host_Shield打开新USB_Host_Shield目录下\examples\adk\demokit_20\下的pde文件通过arduinoIDE打开,编译,上传到板子上,重新插拔与手机连接的USB线,Cheers,应该有警告框弹出了:),连接打通!附上USB_HOST_SHIELD lib 2.0地址/mcu/google-open-accessory-interface-for-usb-host-shield-library-2-0-released如果还有问题可以联系我,虽然我未必能回答也未必回答及时,但是我会尽力做出反馈的zidongmo@。
USB HostUSB Host,中文意思是USB主模式,是相对于USB accessory(USB副模式)来说的,前者是在android设备上插入一USB设备,android设备做为主机运行;后者也是在android设备上通过USB数据线插入另外一个设备,但插入的设备可以是一个完整的独立主机,也就是可以是另外一个android设备。
需要注意的是以上两种模式在android API level-12以下是不支持的,也就是说只有android3.1及更高的版本才支持这两种模式,下面对USB主模式做一简介:bManager负责管理USB设备的类,你可以在相应代码中通过以下方法获得此对象的一个实例:UsbManager manager = (UsbManager) getSystemService(B_SERVICE);该类提供的主要方法有:1) getDeviceList()获得设备列表,返回的是一个HashMap.;2) hasPermission(UsbDevice device)判断你的应用程序是否有接入此USB设备的权限,如果有则返回真,否则返回false.3) openDevice(UsbDevice device)打开USB设备,以便向此USB设备发送和接受数据,返回一个关于此USB设备的连接。
4) requestPermission(UsbDevice device, PendingIntent pi)向USB设备请求临时的接入权限。
bDevice代表一个USB设备的类,每个设备都包含了一个或多个接口,每个接口又包含一个或多个节点用来与此设备传输数据。
该类的主要方法有:1) getDeviceClass()返回此USB设备的类别,用一个整型来表示。
2) getDeviceId()返回唯一标识此设备的ID号,也用一个整型来表示。
3) getDeviceName()返回此设备的名称,用一个字符串来表示。
CH9343 Android应用程序开发手册版本:V1.1简介CH9343是基于Android Open Accessory协议开发的USB Android Host芯片。
针对USB Android 设备提供了GPIO、PWM、UART、SPI Master、SPI Slave及I2C主机,共6种接口。
用户可以调用相关接口的API与Accessories通讯。
Android Device、CH9343、Accessories三者关系如下图。
CH9343提供的接口需要基于Android 3.1及以上版本系统,用户可以选择上述任一接口与Accessories通讯。
本文档将会重点说明Android Device和CH9343的USB通讯数据格式。
关于Android Open Accessory协议说明,可以参考Google官方文档。
1 Android Device本文档所描述的例子程序皆是在Android 3.1及以上版本系统下编写的。
Android 应用程序的启动参数是定义在accessory_filter.xml文件中的manufacturer、model和version。
基于CH9343开发的Android应用程序主要分为两个部分:图1: WCH CH9343 Android ApplicationsUser Layout:主要由用户根据自己的需求完成相关代码,通过调用CH9343 Interface Layout 提供的GPIO、PWM、UART、SPI Master、SPI Slave或I2C主机接口函数实现。
CH9343 Interface Layout:实现了6种接口模式下的Interface类,提供给User Layout调用。
此外还实现了Android Device和CH9343芯片之间的USB通信,6种不同的接口具有不同的通信协议,具体内容参考后续说明。
2 Android GPIO Demo2.1 GPIOCH9343提供了8个GPIO端口,可配置成输入或输出方式。
安卓android手机修改host文件方法方法一Android手机是和Google帐号紧密联系的,很多时候Google帐号无法登录,导致Android市场无法使用。
在电脑上我们通过修改Hosts方法可以解决Google帐号的登录问题,在Android手机上也可以使用这个方法。
具体操作过程是:先通过各种方法让Android手机获取Root权限,之后运行Root Explorer管理器,进入可写状态,找到/system/etc/hosts的文件,将其权限修改为可写。
打开Terminal Emulator,输入su,进入root模式,输入vi /system/etc/hosts 命令,按i进入编辑模式,之后将用户电脑上的hosts文件内容也输入进去。
Android虚拟终端下当vi在编辑模式时,按下“确定”键(Trackball),再按下虚拟键盘上的“1”,就可以退出编辑模式了(CTRL+[),这个时候使用:wq 就可以保存退出了。
之后重启手机即可。
方法二电脑修改法注意:usb设置为调试模式1、手机必须先root,小米可以安卓开发版系统即可2、安卓 adb工具(android debug bridge)3、依次执行下面的命令1、adb root 获得root权限会自动启动server2、adb remount 设置/system为可读写;3、adb pull /system/etc/hosts 将手机的hosts文件复制到PC的C盘根目录4、PC 机上打开hosts文件,修改完成后,保存5、adb push hosts /system/etc/ 将PC机上hosts文件复制到手机4、验证是否修改成功。
Android开发USB通信的实现方法我们都知道,一般手机和PC机连接,手机是属于从机的,那么想要把手机变成主机(HOST)改如何实现呢?这就需要代码来实现了。
首先,和开发其他安卓应用一样新建工程,做好相应属性的配置工作。
然后去实现具体的数据接收和发送功能。
以下的代码给大家提供参考。
SDK 的方法:bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)private void sendData() {//byte b = (byte) 129; // (byte) 0x81 Also workint status = connection.bulkTransfer(endPointWrite, toByte(129), 1, 250);}private static byte toByte(int c) {return (byte) (c <= 0x7f ? c : ((c % 0x80) - 0x80));}// for received data from USB HID deviceprivate static int toInt(byte b) {return (int) b & 0xFF;}读写数据:UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点UsbEndpoint inEndpoint = usbInterface.getEndpoint(0); //读数据节点UsbEndpoint outEndpoint = usbInterface.getEndpoint(1); //写数据节点UsbDeviceConnection connection = usbManager.openDevice(usbDevice);connection.claimInterface(usbInterface, true);//发送数据byte[] byte2 = new byte[64];int out = connection.bulkTransfer(outEndpoint, cmd, cmd.length, 3000);//读取数据1 两种方法读取数据int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);Log.e("ret", "ret:"+ret);for(Byte byte1 : byte2){System.err.println(byte1);}//读取数据2/*int outMax = outEndpoint.getMaxPacketSize();int inMax = inEndpoint.getMaxPacketSize();ByteBuffer byteBuffer = ByteBuffer.allocate(inMax);UsbRequest usbRequest = new UsbRequest();usbRequest.initialize(connection, inEndpoint);usbRequest.queue(byteBuffer, inMax);if(connection.requestWait() == usbRequest){byte[] retData = byteBuffer.array();for(Byte byte1 : retData){System.err.println(byte1);}}*/当然,如何调用安卓系统的USB操作权限,在eoe安卓开发社区都有相应的答案,实现起来也是比较容易的。
Android手机通过USB设置默认网关上网详细图解教程1.安装必备的软件A)首先要确保PC上安装了手机的驱动程序,相信这个大家都装了。
B)安装root权限工具,我用的是superuser,后面会说到怎么使用。
C)安装Gscript,用来一键设置USB上网功能。
2. 设置A)将手机设置为调试模式,我们要做的就是让USB支持调试模式。
步骤:将Application Settings/Development/USB debugging 勾选上。
B1)将手机设置为可以通过USB共享PC网络(Defy)步骤:将Wireless & networks/Mobile networks/internet tethering 勾选上。
B2)有的手机设置通过USB共享PC网络的方式可能不同,你可能看到的是下面这种共享设置的方式步骤:将绑定/USB绑定勾选上C)将PC上的USB线与手机连接电脑网络连接里会多出一个本地连接,为方便查看我把名称改为android右键查看电脑本身上网通过的网络连接的属性(如果你的电脑端使用有线网络上网,则打开“本地连接”;如果你的电脑端使用无线网络上网,则打开“无线网络连接”;如果你使用电脑中的拨号上网,则打开拨号用的宽带连接),我的是有线连接,我打开“本地连接”的属性,选择“高级”选项卡,勾选“允许其他网络用户通过此计算机的Internet连接来连接”,确定。
(如果你有多个其他网卡,可能需要像下面右侧的图中选择“手机网络共享”连接,这个图是从其他地方拿来的)此时,双击查看“手机网络共享”的状态,查看“支持”选项卡中的内容,可以看到“IP地址”被系统自动设为了192.168.16.1。
(这很重要,该IP地址要与脚本中的IP地址一致,你可以按照你所处的环境来修改IP地址、子网掩码、和网关,但请确保它们与脚本中的设置一致。
)PC端的设置完毕,且以后不必再更改。
D)安装Gscript,并按add script添加一个自定义的脚本online-usb,然后保存。
Android:USB设备信息获取lsusb:查看系统当前连接的所有USB设备cat /sys/kernel/debug/usb/devices :每个USB设备及其配置描述符T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 1 //第⼀层 EHCI 控制器B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS=64 #Cfgs= 1P: Vendor=1d6b ProdID=0002 Rev= 5.04S: Manufacturer=Linux 5.4.86-android11-2-g9b3456a83314-dirty xhci-hcdS: Product=xHCI Host ControllerS: SerialNumber=xhci-hcd.0.autoC:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mAI:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hubE: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256msT: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 4 //第⼆层 HUBD: Ver= 2.10 Cls=09(hub ) Sub=00 Prot=02 MxPS=64 #Cfgs= 1P: Vendor=2109 ProdID=2817 Rev=90.13S: Manufacturer=VIA Labs, Inc.S: Product=USB2.0 HubS: SerialNumber=000000000C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mAI: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=01 Driver=hubE: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=256msI:* If#= 0 Alt= 1 #EPs= 1 Cls=09(hub ) Sub=00 Prot=02 Driver=hubE: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=256msT: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 11 Spd=480 MxCh= 0 //第三层连接到HUB上的设备D: Ver= 2.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1P: Vendor=0bda ProdID=b812 Rev= 2.10S: Manufacturer=RealtekS: Product=802.11ac NICS: SerialNumber=123456C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mAI:* If#= 0 Alt= 0 #EPs= 5 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)E: Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0msE: Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0msE: Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=0msE: Ad=87(I) Atr=03(Int.) MxPS= 64 Ivl=500usE: Ad=08(O) Atr=02(Bulk) MxPS= 512 Ivl=0mscat /proc/bus/input/devices :查看连接的输⼊设备信息cat sys/bus/usb/devices/2-1.1/ :查看对应USB设备的详细信息,例如 2-1.1:1.0 命名规则是:roothub-port:configuration.interface.)cat /sys/bus/usb/devices/2-1.1\:1.0/bInterfaceClass :查看当前设备所⽀持的特性,例如: 01 表⽰⽀持audio只查看连接设备的端⼝信息:# ls /sys/bus/usb/drivers/usb/1-1 1-1.2 1-1.2.3.1 1-1.3.1 2-1 2-1.2.3 uevent usb11-1.1 1-1.2.3 1-1.3 1-1.3.3 2-1.2 bind unbind usb2查看主次设备号:# cat /sys/bus/usb/devices/1-1.4/ueventMAJOR=189MINOR=9DEVNAME=bus/usb/001/010DEVTYPE=usb_deviceDRIVER=usbPRODUCT=bda/b812/210TYPE=0/0/0BUSNUM=001DEVNUM=010\system\core\libusbhost\usbhost.c\frameworks\base\services\core\jni\com_android_server_UsbHostManager.cpp\frameworks\base\core\java\android\hardware\usb\UsbInterface.java\frameworks\base\services\usb\java\com\android\server\usb\UsbHostManager.java \frameworks\base\services\usb\java\com\android\server\usb\UsbService.java。
USB HostUSB Host,中文意思是USB主模式,是相对于USB accessory(USB副模式)来说的,前者是在android设备上插入一USB设备,android设备做为主机运行;后者也是在android设备上通过USB数据线插入另外一个设备,但插入的设备可以是一个完整的独立主机,也就是可以是另外一个android设备。
需要注意的是以上两种模式在android API level-12以下是不支持的,也就是说只有android3.1及更高的版本才支持这两种模式,下面对USB主模式做一简介:UsbManagerbManager负责管理USB设备的类,你可以在相应代码中通过以下方法获得此对象的一个实例:UsbManager manager=(UsbManager)getSystemService(B_SERVICE);该类提供的主要方法有:getDeviceList()()1)getDeviceList获得设备列表,返回的是一个HashMap.;hasPermission((UsbDevice device)2)hasPermission判断你的应用程序是否有接入此USB设备的权限,如果有则返回真,否则返回false.3)openDeviceopenDevice((UsbDevice device)打开USB设备,以便向此USB设备发送和接受数据,返回一个关于此USB设备的连接。
4)requestPermissionrequestPermission((UsbDevice device,PendingIntent pi)向USB设备请求临时的接入权限。
UsbDevicebDevice代表一个USB设备的类,每个设备都包含了一个或多个接口,每个接口又包含一个或多个节点用来与此设备传输数据。
该类的主要方法有:1)getDeviceClassgetDeviceClass()()返回此USB设备的类别,用一个整型来表示。
getDeviceId()()2)getDeviceId返回唯一标识此设备的ID号,也用一个整型来表示。
getDeviceName()()3)getDeviceName返回此设备的名称,用一个字符串来表示。
getDeviceProtocol()()4)getDeviceProtocol返回此设备的协议类别,用一个整型来表示。
5)getDeviceSubclassgetDeviceSubclass()()返回此设备的子类别,用一个整型来表示。
getVendorId()()6)getVendorId返回生产商IDgetProductId()()7)getProductId返回产品ID8)getInterfaceCountgetInterfaceCount()()返回此设备的接口数量(int index)9)getInterfacegetInterface(int得到此设备的一个接口,返回一个UsbInterface。
UsbInterfacebInterface代表USB设备的一个接口,注意:UsbInterface本身是一个类,并不是一个接口。
此类的主要方法有以下:getId()()1)getId得到给接口的id号。
getInterfaceClass()()2)getInterfaceClass得到该接口的类别。
3)getInterfaceSubclassgetInterfaceSubclass()()得到该接口的子类。
getInterfaceProtocol()()4)getInterfaceProtocol得到该接口的协议类别。
5)getEndpointCountgetEndpointCount()()获得关于此接口的节点数量。
(int index)getEndpoint(int6)getEndpoint对于指定的index获得此接口的一个节点,返回一个UsbEndpoint. UsbEndpointbEndpoint代表一个接口的某个节点的类。
该类主要提供了一下方法供你使用:1)getAddressgetAddress()()获得此节点的地址2)getAttributesgetAttributes()()获得此节点的属性getDirection()()3)getDirection获得此节点的数据传输方向UsbDeviceConnectionbDeviceConnection代表USB连接的一个类。
用此连接可以想USB设备发送和接收数据,可以通过调用该方法openDevice(UsbDevice)来得到该类的一个实例。
该类提供了以下方法供你使用:1)bulkTransfer(UsbEndpoint endpoint,byte[]buffer,int length, int timeout)通过给定的endpoint来进行大量的数据传输,传输的方向取决于该节点的方向,buffer是要发送或接收的字节数组,length是该字节数组的长度。
传输成功则返回所传输的字节数组的长度,失败则返回负数。
2)controlTransfer(int requestType,int request,int value,int index,byte[]buffer,int length,int timeout)该方法通过0节点向此设备传输数据,传输的方向取决于请求的类别,如果requestType为USB_DIR_OUT则为写数据,USB_DIR_IN,则为读数据Android配置文件要求在你使用以上API进行开发之前,你需要在你的AndroidManifest.xml文件中添加以下内容:1.因为并不能保证所有的安卓设备都支持以上API,所以你需要声明:<uses-sdk android:minSdkVersion="12"/>12以下的版本是不支持以上APId的。
<uses-feature android:name="b.host"/>2.如果你想有一个USB设备接入你的安卓设备时能够通知你的应用程序,那么你需要在你的Activity标签中声明以下内容<intent-filter><actionandroid:name="B_DEVICE_ ATTACHED"/></intent-filter><meta-dataandroid:name="B_DEVIC E_ATTACHED"android:resource="@xml/device_filter"/>Resource属性指定了要过滤的数据设备信息,包括:1)vendor-id设备生产商id2)product-id设备id3)class设备类别4)subclass设备子类5)protocol(device or interface)协议类别device_filter.xml文件放在res\xml目录下,其中文件名不包括扩展名部分需要与<meta-data/>标签中声明的一致。
示例如下:<?xml version="1.0"encoding="utf-8"?><resources><usb-device vendor-id="1234"product-id="5678"class="255"subclass="66"protocol="1" /></resources>开发步骤1.检测设备你的应用可以通过两种方式来发现USB设备,一种是用一个意图过滤器在用户连接一个设备时对其进行通知,另一种则是通过枚举您已经连接的所有USB设备。
如果你希望你的应用能够自动的探测到你想要的设备,请使用一个意图过滤器来做。
但是,如果你希望得到一个已连接设备的列表或者你不希望过滤意图,枚举所有的设备会是一个更好的选择。
1)Intent Filter为了让应用可以发现一个特定的USB设备,你可以为B_DEVICE_ATTACHED这个意图指定一个意图来进行过滤。
伴随着这个意图过滤器,您需要指定一个资源文件来特别说明这个USB设备的属性,例如供应商和产品ID。
当用户连接到一个符合你配件过滤条件的配件时,这个系统会谈出一个对话框询问他们是否希望开始你的应用。
如果用户同意,那么你的应用在失去连接之前会自动获取和设备连接的权限。
下面的例子告诉你该如何声明这个意图过滤器:<activity...>...<intent-filter><action android:name="B_DEVICE_ATTACHED"/> </intent-filter><meta-data android:name="B_DEVICE_ATTACHED"android:resource="@xml/device_filter"/></activity>下面的例子告诉你怎么样声明指定你希望连接的USB设备的相关资源文件:<?xml version="1.0"encoding="utf-8"?><resources><usb-device vendor-id="1234"product-id="5678"/></resources>2)列举设备你可以通过UsbMnanger来列举已经连接的USB设备:代码如下首先,得到UsbMnanger的一个实例UsbManager manager=(UsbManager)getSystemService(B_SERVICE);其次,通过此类的getDeviceList()方法得到包含所有已连接的USB设备的列表HashMap<String,UsbDevice>deviceList=manager.getDeviceList();最后,通过设备名称来得到给设备对象UsbDevice device=deviceList.get("deviceName");如果你想一个一个的列举所有的设备,可以实用迭代器,代码实例如下:UsbManager manager=(UsbManager)getSystemService(B_SERVICE);HashMap<String,UsbDevice>deviceList=manager.getDeviceList();Iterator<UsbDevice>deviceIterator=deviceList.values().iterator();while(deviceIterator.hasNext()){UsbDevice device=deviceIterator.next()//在这里添加处理设备的代码}2.获得和设备通信的权限如果你实用intent filter来发现一个USB设备,即上述方法1)那么应用程序可以自动的获取权限;如果是使用方法2)来检测USB设备,则你需要显示声明权限。