首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

求解:android 4.0读写HID设备解决方案

2014-05-12 来源:读书人网 【读书人网(Reader8.cn):综合教育门户网站】
求解:android 4.0读写HID设备大家好,从3.1开始,android设备已经可以作为HOST端了,并且官方提供一套访问USB

求解:android 4.0读写HID设备
大家好,从3.1开始,android设备已经可以作为HOST端了,并且官方提供一套访问USB的API。
我需要在Android 4.0下用官方的USB API读写外部USB设备。

测试环境:
手机:三星9250
系统:android 4.0
外接设备:U盘,鼠标,键盘

参考官方代码,我写了一个读取USB设备的小应用。
经过验证,只有U盘能够被应用层正确读写,而HID设备根本无法被获取。

目前,我个人推断是USB设备在KERNEL中被MOUNT成指定的文件。
UsbManager就是去枚举这些文件。
HID设备不会被MOUNT成指定文件,所以应用层无法访问。

不知道各位是否有做过类似的开发,能否给我点提示。

附测试代码:


private void UsbInit()
{
        Intent intent = getIntent();
        mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
        
        if(mUsbManager == null)
        {
Toast.makeText(this,
"USB manager is not OK",
Toast.LENGTH_LONG).show();        

return ;
        }
        
        //mUsbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        // check for existing devices
        for (UsbDevice device :  mUsbManager.getDeviceList().values()) {
            if (device != null)
            {
            mUsbDevice = device;
            break;
           }
       }
        
        if(mUsbDevice == null)
        {
Toast.makeText(this,
"USB is not OK",
Toast.LENGTH_LONG).show();        
        return;
        } else {
        String tmp = "vid is ";
        tmp = tmp + Integer.toHexString(mUsbDevice.getVendorId()) + ".";
        tmp = tmp + "pid is ";
        tmp = tmp + Integer.toHexString(mUsbDevice.getProductId()) + ".";
        
        Toast.makeText(this, tmp, Toast.LENGTH_LONG).show();
        }
        
        if (mUsbDevice.getInterfaceCount() != 1) {
            Log.e(TAG, "could not find interface");
            return;
        }
        UsbInterface intf = mUsbDevice.getInterface(0);
        // device should have one endpoint
        if (intf.getEndpointCount() < 1) {
            Log.e(TAG, "could not find endpoint");
            return;
        }
        // endpoint should be of type interrupt
        UsbEndpoint ep = intf.getEndpoint(2);
        if (ep.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) {
            Log.e(TAG, "endpoint is not interrupt type");
            return;
        }

        mEndpointIntr = ep;
        
        if (mUsbDevice != null) {
            UsbDeviceConnection connection = mUsbManager.openDevice(mUsbDevice);
            if (connection != null && connection.claimInterface(intf, true)) {
                Log.d(TAG, "open SUCCESS");
                mConnection = connection;
                Thread thread = new Thread(this);


                thread.start();

            } else {
                Log.d(TAG, "open FAIL");
                mConnection = null;
            }
         }        
}

[解决办法]
解决 读USB节点为空的问题:
1.新建: android.hardware.usb.host.xml
  内容: <?xml version="1.0" encoding="utf-8"?>
<permissions>
  <feature name="android.hardware.usb.host" />
</permissions>

文件送到 终端设备的:  /system/etc/permissions 目录下
  送后需要重新启动设备才有效。

2.修改安卓主配置文件 AndroidManifest.xml

在对应位置添加 :
  <uses-sdk android:minSdkVersion="14" />
    <uses-feature android:name="android.hardware.usb.host" android:required="true"/>
    <!-- android:required="true" -->

          </intent-filter>
            <meta-data 
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
                android:resource="@xml/device_filter" >
            </meta-data>
            
         </activity>

3.在res\xml下添加 device_filter.xml 文件
   文件内容: 
<?xml version="1.0" encoding="utf-8"?>
   <resources>    
      <usb-device vendor-id="3" product-id="2" />
   </resources>
其中:的3和2 为对应的值,如果知道,可以从节点列表中读出,填写正确后,android层能接收到对应的插入或拔出消息。

4.祝你好运