您的位置:首页 > 移动开发 > Android开发

Android有两种方法检测USB设备插入

2014-08-07 09:41 561 查看
OTG线一条, USB接口转换器, 可以把XOOM下面的USB口转成USB母口,可以插USB键盘,Joystick之类

PS3游戏手柄, 测试成功的有 北通,Logitech, 手柄.

检测手柄的插入与拔出

根据Android文档介绍, 有两种方法检测USB设备插入

第一种, 在Manifest 里面加入

<manifest<span style="COLOR: #000000"> ...</span>><span style="COLOR: #000000">
    </span><uses-feature<span style="COLOR: #000000"> </span><span style="COLOR: #882288">android:name</span>="android.hardware.usb.host"<span style="COLOR: #000000"> </span>/><span style="COLOR: #000000">
    </span><uses-sdk<span style="COLOR: #000000"> </span><span style="COLOR: #882288">android:minSdkVersion</span>="12"<span style="COLOR: #000000"> </span>/><span style="COLOR: #000000">
    ...
    </span><application><span style="COLOR: #000000">
        </span><activity<span style="COLOR: #000000"> ...</span>><span style="COLOR: #000000">
            ...
            </span><intent-filter><span style="COLOR: #000000">
                </span><action<span style="COLOR: #000000"> </span><span style="COLOR: #882288">android:name</span>="android.hardware.usb.action.USB_DEVICE_ATTACHED"<span style="COLOR: #000000"> </span>/><span style="COLOR: #000000">
            </span></intent-filter><span style="COLOR: #000000">

            </span><meta-data<span style="COLOR: #000000"> </span><span style="COLOR: #882288">android:name</span>="android.hardware.usb.action.USB_DEVICE_ATTACHED"<span style="COLOR: #000000">
                </span><span style="COLOR: #882288">android:resource</span>="@xml/device_filter"<span style="COLOR: #000000"> </span>/><span style="COLOR: #000000">
        </span></activity><span style="COLOR: #000000">
    </span></application><span style="COLOR: #000000">
</span></manifest>

对应的device_filter.mxl



<?<span style="COLOR: #000000">xml version</span>="1.0"<span style="COLOR: #000000"> encoding</span>="utf-8"?><span style="COLOR: #000000">

</span><resources><span style="COLOR: #000000">
    </span><usb-device<span style="COLOR: #000000"> </span><span style="COLOR: #882288">vendor-id</span>="1234"<span style="COLOR: #000000"> </span><span style="COLOR: #882288">product-id</span>="5678"<span style="COLOR: #000000"> </span>/><span style="COLOR: #000000">
</span></resources>

其中, vendor-id 和 product-id 每个不同型号的手柄得到的值都是不一样的.具体获取方法下面会提到.

做好以上配置以后, 当设备插入的时候, 系统会弹出一个提示框, 询问你是否要打开这个程序.点击确定的话就会启动你的APP.



第二种方法. 遍历USB Device



UsbManager<span style="COLOR: #000000"> manager </span>=<span style="COLOR: #000000"> </span>(UsbManager)<span style="COLOR: #000000"> getSystemService</span>(Context.<span style="COLOR: #000000">USB_SERVICE</span>);<span style="COLOR: #000000">
</span>...<span style="COLOR: #000000">
</span>HashMap<String,<span style="COLOR: #000000"> </span>UsbDevice><span style="COLOR: #000000"> deviceList </span>=<span style="COLOR: #000000"> manager</span>.<span style="COLOR: #000000">getDeviceList</span>();<span style="COLOR: #000000">
</span>Iterator<UsbDevice><span style="COLOR: #000000"> deviceIterator </span>=<span style="COLOR: #000000"> deviceList</span>.<span style="COLOR: #000000">values</span>().<span style="COLOR: #000000">iterator</span>();<span style="COLOR: #000000">
</span>while(<span style="COLOR: #000000">deviceIterator</span>.<span style="COLOR: #000000">hasNext</span>()){<span style="COLOR: #000000">
    </span>UsbDevice<span style="COLOR: #000000"> device </span>=<span style="COLOR: #000000"> deviceIterator</span>.next()<span style="COLOR: #000000">
    int vendorId = device.getVendorId(); int productIt = device.getProductId();  如果是用第一种方法检测的话device_filter.mxl里面的两个值要填这两个</span><span style="COLOR: #000000">
</span>}

用这种遍历方法我是程序启动的时候起一条线程隔三秒检测一次, 检测到手柄后根据各自需求处理.



检测USB设备拔出:

usb设备拔出的时候会抛出一个action值为UsbManager.ACTION_USB_DEVICE_DETACHED的广播, 注册一个广播接收即可.

其实UsbManager还有一个UsbManager.ACTION_USB_ACCESSORY_ATTACHED的值,从文档上看意思是usb设备插入时候会有这个广播抛出,但是实际上却没有收到这个广播



事件捕获

按钮事件可以通过重写OnKeyDown和OnKeyUp捕获这些事件

if(event.getDevice() != null && event.getDevice().getSources() == 0x1000511){

// 该事件来自Joystick

}



扫描码: int scanCode = event.getScanCode();

如果是Joystick的上下左右事件, scanCode 的值为0, 测试过10几款手柄,得到的数值都是

keyCode == 19 // 上

keyCode == 20 // 下

keyCode == 21 // 左

keyCode == 22 // 右



游戏手柄上左边蘑菇头的事件可以通过重写onGenericMotionEvent获得,

float x = event.getX(), float y = event.getY(); 这些得到的数据都是坐标,具体数值是精确到小数点后9位



最后附上一个本人接好手柄后在XOOM上玩极品飞车14的视频. http://www.tudou.com/programs/view/8TLNkvRgFoU/

测试代码下载:http://download.csdn.net/detail/s278777851/4160430

测试代码是抽离出来的, 暂时没有设备可以测试,不过大致的代码是没错的,希望对大家有帮助。

另外我再说明一下, 我这个程序只用过游戏手柄测试过,数据都能拿到, 其他usb如果android是有支持的应该也是可以拿到的,

之前有朋友加我的QQ说我的程序拿不到数据, 最后查出来是因为android不支持他的usb设备。如有问题,欢迎讨论。

2012/6/18更新: 因为有很多说设备拿不到数据. 目前通过加QQ沟通的朋友拿不到的主要有两个原因。

1. android 系统本身不支持特殊的设备,有时候虽然能够识别到,但不一定能够拿到productID和vectorId, 所以大家的测试的建议使用一些官方有说明支持的,我用游戏手柄测试的运气比较好,所有的手柄都是能拿到数据的。

2. android 设备和版本也有一定要求,有个朋友也说是拿不到数据,那个时候他用的平板是国产的某平板,后来他买了XOOM再测试的时候发现就能拿到了,所以这里建议大家使用一些官方的设备来做测试,xoom或者galaxy Tab(7寸除外,7寸GT不支持3.x) 都是不错的选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: