【问题标题】:Android Usb Host Problem with Samsung Galaxy 10.1 Tablet三星 Galaxy 10.1 平板电脑的 Android USB 主机问题
【发布时间】: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


【解决方案1】:

SOO 不幸的是,三星 Galaxy 平板电脑似乎无法很好地与 UsbManager 和世界上大约一半的 USB 设备配合使用。三星的内核似乎会触发存储设备等的意图,但不会触发 HID 和其他随机设备(例如 arduino、我的 USB 传感器和 HID 设备)。这似乎是三星内核中的一个错误。有趣的是,HID 设备在平板电脑上工作,但在 UsbManager 上没有枚举。我发现了相同问题的几个链接,似乎内核补丁(或 acer 平板电脑)是解决此 atm 的唯一方法。希望三星将来会修复。如果重建内核是你的事并且你真的需要让 UsbManager 工作,那么这里是一个做了内核补丁的人的链接。我尚未测试,但计划最终测试,并将对我的想法发表评论。 http://forum.xda-developers.com/showthread.php?t=1233072

【讨论】:

  • 您链接的内核补丁不适用于此处。它适用于三星 Galaxy Tab 7",但家长正在谈论三星 Galaxy Tab 10.1,因为他将 Honeycomb 作为其 Manifest 中的最低 SDK。
  • 真的没有更新可以让 USB 主机模式在三星上运行而无需任何修补吗?我正在使用 Acer Iconia 500,一切正常,没有任何问题 - 我也很想在三星上使用它
【解决方案2】:

我也面临同样的问题,但您可以使用一种方法 deviceName(),在枚举设备后,您可以使用 device.getdeviceName() 方法将设备名称存储在字符串中。

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

【讨论】:

    【解决方案3】:

    三星已从 Android 内核中移除 USB API

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您看不到 HID 设备可能还有另一个(讨厌的)原因。

        UsbHostManager.beginUsbDeviceAdded() "从 monitorUsbHostBus() 中的 JNI 调用以报告新的 USB 设备"。此方法调用私有方法isBlackListed(),它将无条件过滤掉所有 HUB 和带有子类 BOOT 的 HID。 这可能是您在执行getDeviceList() 时看不到 HID 设备的原因

        如果有人对此有解决方法,我认为有相当多的用户会很高兴看到这个。

        【讨论】:

          【解决方案6】:

          我已成功地将我的 Arduino Uno 连接到我的三星 Galaxy Tab 10 P7500。 如果连接有问题,那是因为平板电脑拒绝了没有外接电源的 USB 设备的权限。 尝试使用 5 或 3.3 伏 AC/DC 适配器从外部为您的设备供电,第一次,如果您发现您的设备已连接并触发意图,拔下电源适配器,您的设备将在没有外部电源的情况下运行,平板电脑本身会通过USB OTG供电

          【讨论】:

            猜你喜欢
            • 2015-05-11
            • 1970-01-01
            • 2011-05-29
            • 2013-12-05
            • 2014-02-25
            • 2012-08-15
            • 2019-09-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多