1

我正在开发一个应用程序,我需要使用平板电脑的 USB 主机模式来管理设备。

此时,我只能在设备连接处激活 USB。工艺步骤:

  1. 没有应用程序启动,设备连接。
  2. Android 问我是否要启动我的应用程序
  3. 我接受
    然后应用程序启动,我可以使用 USB 连接。

但是,这不是我想做的:

  1. 关闭平板电脑,连接设备
  2. 打开平板电脑
  3. 手动启动应用程序
  4. 初始化与设备的 USB 连接。

事实是,实际上,我需要手动断开/连接平板电脑上的 USB 才能建立连接,但在我的情况下,设备已经连接到平板电脑,然后我需要在不断开连接的情况下初始化连接/重新连接USB。

我已经尝试过 Google 在 USB Host connexion 页面上提供的关于广播接收器的示例,但它不起作用,或者我不太了解它。

我的问题是:
有什么方法可以打开与已经连接的 USB 主机设备的连接?
通过女巫的方式,我需要搜索以找到这个被阻止的解决方案:D

这里已经实现的代码有助于理解我的问题:

清单.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="..."
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="13" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/..." 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >

        <activity
            android:name="...Activity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            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>
</manifest>

文件 res/xml/device_filter.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-device vendor-id="5455" product-id="8238" />
</resources>

然后我的 Activity 中的 onResume() :

@Override
protected void onResume() {
    super.onResume();

    Intent intent = getIntent();
    String action = intent.getAction();

    if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {

        UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        UsbManager usbManager = (UsbManager) activity.getSystemService(Context.USB_SERVICE);

    } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
    }
}

最后我的方法允许建立连接:

protected void open(Object o) throws DeviceException {
    if (device != null && device.getVendorId() == 5455 && device.getProductId() == 8238) {
        int nbEndPoint = 0;
        for (int i = 0; i < device.getInterfaceCount(); i++) {
            UsbInterface usbInterface = device.getInterface(i);

            for (int j = 0; j < usbInterface.getEndpointCount(); j++) {
                UsbEndpoint usbEndPoint = usbInterface.getEndpoint(j);
                nbEndPoint++;
                switch (nbEndPoint) {
                case 1:
                    this.pipeWriteData = usbEndPoint;
                case 2:
                    this.pipeReadCommandResult = usbEndPoint;
                case 3:
                    this.pipeReadAutoStatus = usbEndPoint;
                case 4:
                    this.pipeReadImageData = usbEndPoint;
                }
            }
        }

        usbConnection = manager.openDevice(device);
        if (usbConnection == null || !usbConnection.claimInterface(device.getInterface(0), true)) {
            usbConnection = null;
            throw new DeviceException(DeviceException.UNKNOW_ERROR);
        }
    }
}
4

1 回答 1

0

我的猜测是您的应用程序可能与侦听器建立了通信,该侦听器正在寻找刚刚由 USB 设备建立的连接。如果打印机已经连接并且您的应用程序正在等待该侦听器,则不会发生,因为您的回调函数不会被调用,USB 打印机在您的应用程序运行之前已经存在。这是一个猜测,因为我没有看到您的代码,但我在其他情况下看到了这种行为。

在问题中获得更多信息后进行编辑。正如我在评论中所说,如果设备在启动时已经连接,我相信启动您的应用程序(...USB_DEVICE_ATTACHED)的事件不会发生。为了证明这一点,你应该用logcat(查看)(写)添加很多痕迹在您的代码中,在您的 onCreate、onResume 中,并且可能在其他地方。这样做,您将看到每个部分是否执行您所期望的。我的猜测是,当您启动并且 USB 设备已经连接时,它根本不会执行。如果我明白你想要的是这个。连接设备时,您想启动您的应用程序。但是如果设备在启动时已经存在,您希望您的应用程序无论如何都可以启动并连接到 USB。我解决这个问题的方法是让你的应用程序寻找目标 USB 设备的存在。存在与“USB_DEVICE_ATTACHED”不同,这意味着它只是在最后几毫秒内连接。我还将在“USB_DEVICE_ATTACHED”上注册一个侦听器,该侦听器将在设备连接上启动您的代码,我还将在“BOOT_COMPLETED”上设置一个侦听器

于 2013-04-09T14:59:33.437 回答