USB Host --> Impossible de connecter l'application au périphérique
Bonjour,
Je développe actuellement une application qui exploite les nouvelles fonctionnalités fournis par Android, à savoir la communication vers des périphériques en mode Host.
J'ai donc suivi les procédures fournies par Google sur developper.android.com et sur les divers forums et autres blog.
Voici donc peu ou prou ce que j'ai implémenté :
manifest.xml :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
<?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> |
Le fichier res/xml/device_filter.xml :
Code:
1 2 3 4 5 6
|
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="5455" product-id="8238" />
</resources> |
Ensuite le code du onResume() dans mon Activity :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
@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)) {
}
} |
Et enfin, voici ma méthode qui permet d'ouvrir la connexion :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
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);
}
}
} |
Donc mon application démarre bien quand je connecte mon périphérique avec un câble OTG à ma tablette.
Le hic, si je puis dire, c'est que ce n'est pas le fonctionnement nominal que je désire.
En effet, ma tablette va être enchâssée dans un support, et il sera impossible de déconnecter et connecter le périphérique à chaque fois que l'on en aura besoin.
L'idée est donc, de pouvoir initialiser et établir la connexion USB avec le périphérique, alors que celui ci est déjà connecté, lors du démarrage de l'application.
Or, pour réaliser cela, je ne trouve aucune information relative à ce sujet. Le web ne parle que de l'autre cas, où l'on connecte le périphérique et que celui-ci active le démarrage de l'application.
Je fait donc appel à vous et vos incommensurables connaissances, pour m'aiguiller et me donner quelques pistes de recherche.
Je vous remercie par avance. Cordialement