我正在尝试利用三星Galaxy Tablet的USB主机功能。我从三星(http://www.samsung.com/us/mobile/galaxy-tab-accessories/EPL-1PL0BEGSTA)购买了附件加密狗。当我第一次通过这个加密狗连接usb设备时,我从Galaxy Tablet中获得了高功率错误-仅供参考,使用外部供电的usb集线器,您可以双通这个。
现在,当我连接设备时,设备本身承认USB外设的存在,我尝试使用Android的Android .hardware. USB . usbdevice;进口android.hardware.usb.UsbManager;图书馆。我看到有两种方法可以识别USB设备,通过
注册一个广播接收器来侦听意图。IntentFilter usbIntentFilter = new IntentFilter();
usbIntentFilter.addAction("android.hardware.usb.action.USB_DEVICE_ATTACHED");
usbIntentFilter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED");
registerReceiver(mUsbReceiver,usbIntentFilter);
当我连接任何设备时,这不会触发任何意图,奇怪…所以我继续尝试下一种方法:通过UsbManager显式查询设备列表——这是这样完成的:
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
int count = deviceList.size();
Iterator<UsbDevice> iterator = deviceList.values().iterator();
if(iterator.hasNext()){
UsbDevice deviceVal = iterator.next();
testTxtView1.setText("set device " + deviceVal);
}
这可能会抓取当前连接的一个(目前只有一个USB设备支持每个Google文档)USB设备。为了测试这一点,我将在单击按钮时调用上述代码并显示设备结果。出于某种原因,我每次都从设备列表中获得设备,无论是否连接USB加密狗。此外,无论是否有USB加密狗,设备每次都是相同的。输出如下:
设备usbDevice [mName =/dev/汽车/usb/001/002, mVendorId = 1256, mProductId = 27033, mClass = 0, mSubClass = 0, mProtocol = 0, mInterfaces = [Landroid.os.Parcelable; @406ff4d8]
^^ @406ff4d8的值每次我查询这段代码时都会改变(我只是把它的一个实例放在上面)
我到处找了,没有找到任何类似的问题或解决方案,可能适用于我的情况。我试过实现谷歌的USB示例(这正是我所拥有的,我撕毁了他们的),并遇到了这些问题。
我还应该提到我的清单的组成:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="edu.mit.ll.drm4000"
android:versionCode="1"
android:versionName="1.0">
<uses-feature android:name="android.hardware.usb.host" />
<uses-sdk android:minSdkVersion="12" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".DRM4000Activity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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" />
</activity>
</application>
和设备过滤器:
(我删除了设备过滤器上的标准,但也尝试插入有关我正在寻找的设备的特定信息……)
任何关于这个问题的帮助将非常感激!
另一个更新:我抱怨的设备总是在设备列表中枚举
设备usbDevice [mName =/dev/汽车/usb/001/002, mVendorId = 1256, mProductId = 27033, mClass = 0, mSubClass = 0, mProtocol = 0, mInterfaces = [Landroid.os.Parcelable; @406ff4d8]
一定是android侧的usb端口或什么…因为我开始将一堆不同的设备附加到我的代码中,并发现(类似于这个链接:USB_DEVICE_ATTACHED意图不触发)HID设备,arduino设备…可悲的是…我的USB设备似乎没有触发意图或被USB集线器枚举。我尝试了一个USB闪存驱动器,它确实枚举它并工作…然而,它显示为列表中的第二个设备,第一个是上面列出的始终存在的usbDevice。然而,意图确实与它有关。
有没有人知道一个解决方案,使意图火与HID设备和其他USB设备,除了选择少数android似乎做现在?
很不幸,三星Galaxy Tablet似乎不能很好地与UsbManager和世界上大约一半的USB设备配合使用。三星的内核似乎对存储设备之类的东西有兴趣,但对HID和其他随机设备(比如arduino,我的usb传感器,以及HID设备)没有兴趣。这似乎是三星内核的一个bug。有趣的是,HID设备在平板电脑上工作,但没有在UsbManager上枚举。我发现了几个相同问题的链接,似乎内核补丁(或宏碁平板电脑)是解决这个问题的唯一方法。希望三星能在未来解决这个问题。如果重建内核是你的事情,并且你真的需要让UsbManager工作,这里有一个做内核补丁的人的链接。我还没有测试,但计划最终,并将留下我的想法的评论。http://forum.xda-developers.com/showthread.php?t=1233072
我面临同样的问题,但您可以使用一个方法deviceName(),枚举设备后,您可以使用device. getdevicename()方法将设备名称存储在字符串中。
您将从设备的完整信息中获得确切的设备名称。
三星已经从Android内核中删除了USB API
我认为你应该在resource/xml/device_filter.xml中定义你想要识别的设备。你可以参考android api
可能还有另一个(讨厌的)原因导致你看不到你的HID设备。
UsbHostManager.beginUsbDeviceAdded()
"在monitorUsbHostBus()中从JNI调用以报告新的USB设备"。这个方法调用一个私有方法isBlackListed()
,它将无条件地过滤掉所有的HUB和带有子类BOOT的HID。这可能就是为什么当你执行getDeviceList()
如果有人有解决这个问题的方法,我想有相当多的用户会喜欢看到这个。
我已经成功地将我的Arduino Uno连接到我的三星galaxy tab 10 P7500。如果你连接有问题,那是因为平板电脑拒绝允许没有外部电源的usb设备。尝试使用5或3.3伏AC/DC适配器为设备外部供电,第一次,如果您发现设备已连接并启动意图,拔掉电源适配器,设备将在没有外部电源的情况下运行,平板电脑本身将通过USB OTG提供电源