我正在开发一个应用程序,我需要使用平板电脑的 USB 主机模式来管理设备。
此时,我只能在设备连接处激活 USB。工艺步骤:
- 没有应用程序启动,设备连接。
- Android 问我是否要启动我的应用程序
- 我接受
然后应用程序启动,我可以使用 USB 连接。
但是,这不是我想做的:
- 关闭平板电脑,连接设备
- 打开平板电脑
- 手动启动应用程序
- 初始化与设备的 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);
}
}
}