2011-09-23 112 views
6

我试图利用三星Galaxy平板电脑的USB主机功能。我从三星购买了附件加密狗(http://www.samsung.com/us/mobile/galaxy-tab-accessories/EPL-1PL0BEGSTA)。当我第一次通过这个软件狗连接一个USB设备时,我有一个来自Galaxy平板电脑的高功率错误 - 仅供参考使用一个外部供电的USB集线器,您可以通过这个连接。三星Galaxy 10.1平板电脑的Android USB主机问题

既然设备本身在连接USB设备时确认存在,我尝试使用Android的android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager;图书馆。我看到有通过

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); 

两种方法用于识别USB设备,注册广播接收器监听的意图这不​​是射击任何意图,当我附加任何设备,奇怪... OK。所以,我继续尝试下一个方法:明确查询通过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设备)当前连接的USB设备。为了测试这个,我会在点击按钮时调用上面的代码并显示设备结果。出于某种原因,我每次都从设备列表中获取设备,无论是否连接USB加密狗。此外,无论USB加密狗(或缺少USB加密狗),该设备每次都是相同的。输出如下:

device 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> 

和设备筛选器:


(我删除了设备过滤器上的标准,但也试图插入有关d的具体信息evice我正在寻找......都无济于事。)

任何关于这个问题的帮助将不胜感激!


另一个更新:我抱怨的装置大约总是被列举的设备列表上

设备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 Intent not firing)HID设备,arduino devices..and悲伤......我的USB设备似乎没有触发一个意图或被枚举USB集线器。我尝试了一个USB闪存驱动器,它列举了它,然后工作......但是它显示为列表中的第二个设备,第一个是上面列出的usbDevice。尽管如此,意图还是会随之而来。

有没有人知道一个解决方案,使意图火与HID设备和其他USB设备,除了选择几个android似乎现在做?

+0

你能证实USB主机适用于任何其他应用程序吗?尝试连接PTP相机,看看画廊是否注意到广播的意图。我假设你已经尝试重新启动并将你的Tab更新到最新版本。 –

+0

当我插入键盘时,它似乎工作。我插入时会出现“USB Device Connected”(USB设备已连接)信息。但是,上面的代码为我提供了与键盘相同的输出,插入了其他USB设备,或者没有插入任何设备。我不明白为什么它声称会看到无论是USB设备。我知道它必须是我的代码的东西,因为键盘被识别得很好。顺便说一句:当我连接其他设备它说:“未知的USB设备连接” – hinklecw

+0

另一个更新:我抱怨总是在设备列表上枚举的设备必须是Android的USB端口或什么...因为我开始附加一堆不同的设备到我的代码,发现(类似于这个链接:USB_DEVICE_ATTACHED意图不能触发)HID设备,arduino设备和我的USB设备不会触发意图或被USB集线器枚举。我尝试了一个USB闪存驱动器,它列举了它,然后工作......但是它显示为列表中的第二个设备,第一个是上面列出的usbDevice。尽管如此,意图还是会随之而来。 – hinklecw

回答

4

不幸的是,它看起来像三星Galaxy平板电脑只是没有很好地与UsbManager和世界上大约一半的USB设备玩。三星的内核似乎引发了存储设备之类的意图,但并非针对HID和其他随机设备(比如arduino,以及我们的USB传感器和HID设备)。它似乎是三星内核中的一个bug。有趣的是,HID设备在平板电脑上工作,但未在UsbManager上枚举。我发现了几个同样问题的链接,看起来像内核补丁(或acer平板电脑)是围绕这个atm的唯一方法。希望三星能在未来解决。如果重建内核是你的事情,并且你真的需要让UsbManager工作,那么这里有一个链接给一个做内核补丁的人。我还没有测试,但最终计划,并会对我的想法发表评论。 http://forum.xda-developers.com/showthread.php?t=1233072

+0

您链接的内核补丁在这里不适用。这是为三星Galaxy Tab 7“,但父母谈论的是三星Galaxy Tab 10.1,因为他是他的目标蜂窝作为他的Manifest中的最低SDK。 –

+0

是否真的仍然没有更新可用于获得USB主机模式工作在三星没有任何修补?我使用的是Acer Iconia 500,在那里一切正常,没有任何问题 - 我也很想在三星上使用它 – user387184

0

三星已经移除了Android的籽粒

1

我面临同样的问题USB API,但你可以使用一个方法,设备名称(),枚举设备后,您可以使用device.getdeviceName字符串存储设备名称() 方法。

您将从设备的完整信息中获得确切的设备名称appart。

0

我想你应该在resource/xml/device_filter.xml中定义你想识别的设备。 你可以参考android api。

-2

我已经成功地将我的Arduino Uno连接到我的三星galaxy标签10 P7500。 如果连接时出现问题,这是因为平板电脑拒绝没有外部电源的USB设备的许可。 尝试使用5伏或3.3伏AC/DC适配器从外部为您的设备供电,第一次,如果您发现设备已连接并触发该意图,请拔下电源适配器,并且设备无需外部电源即可工作,但平板电脑本身将通过USB OTG提供电源

0

可能有另一个(令人讨厌的)原因,为什么你看不到你的HID设备。

UsbHostManager.beginUsbDeviceAdded()“在monitorUsbHostBus()中的JNI中调用以报告新的USB设备”。此方法调用私有方法isBlackListed(),它将无条件地过滤掉所有HUB和HID的子类BOOT。 这可能就是为什么你没有看到HID设备,当你做一个getDeviceList()

如果任何人有一种变通方法,以这种情况的原因,我认为有网友在那里相当数量的谁也明白看到这一点。