【发布时间】:2011-09-23 21:08:00
【问题描述】:
我正在尝试利用三星 Galaxy 平板电脑上的 USB 主机功能。我从三星 (http://www.samsung.com/us/mobile/galaxy-tab-accessories/EPL-1PL0BEGSTA) 购买了附件加密狗。当我第一次通过这个加密狗连接 USB 设备时,我遇到了 Galaxy 平板电脑的高功率错误 - 仅供参考,您使用的是外部供电的 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);
}
这可能会抓取当前连接的一个(每个 Google 文档当前仅支持一个 USB 设备)USB 设备。为了测试这一点,我会在单击按钮时调用上面的代码并显示设备结果。出于某种原因,我每次都从设备列表中获取一个设备,无论是否连接了 USB 加密狗。此外,无论 USB 加密狗(或缺少 USB 加密狗)如何,设备每次都是相同的。输出如下:
设备 usbDevice[mName=/dev/bus/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/bus/usb/001/002,mVendorId=1256,mProductId=27033,mClass=0,mSubClass=0,mProtocol=0,mInterfaces=[Landroid.os.Parcelable;@406ff4d8 ]
必须是 android 端的 usb 端口之类的...因为我开始将一堆不同的设备附加到我的代码并发现(类似于此链接: USB_DEVICE_ATTACHED Intent not firing) HID 设备、arduino 设备……可悲的是……我的 USB 设备似乎没有触发意图或被 USB 集线器枚举。我尝试使用 USB 闪存驱动器,它确实枚举它并工作......但是它显示为列表中的第二个设备,第一个是上面列出的永远存在的 usbDevice。不过,意图确实会触发它。
有没有人知道使用 HID 设备和其他 USB 设备触发 Intent 的解决方法,除了少数 android 现在似乎可以这样做?
【问题讨论】:
-
您能否验证 USB 主机是否适用于任何其他应用程序?尝试连接 PTP 摄像头,看看画廊是否注意到正在广播的意图。我假设您已尝试重新启动并将您的标签更新到最新版本。
-
当我插入键盘时,它似乎可以工作。插入时收到“USB 设备已连接”消息。但是,上面的代码在键盘、插入其他 USB 设备或未插入任何设备时给我相同的输出。我不明白为什么它声称看到USB设备不管。我知道它必须与我的代码有关,因为键盘被识别得很好。顺便说一句:当我连接其他设备时,它会显示“已连接未知 USB 设备”
-
另一个更新:我抱怨总是在设备列表中枚举的设备必须是 android usb 端口或其他东西......因为我开始将一堆不同的设备附加到我的代码并发现(类似于此链接:USB_DEVICE_ATTACHED Intent not fire) HID 设备、arduino 设备和我的 USB 设备不会触发 Intent 或被 USB 集线器枚举。我尝试使用 USB 闪存驱动器,它确实枚举它并工作......但是它显示为列表中的第二个设备,第一个是上面列出的永远存在的 usbDevice。不过,意图确实会触发它。
标签: android usb host galaxy-tab