🛠 Limites d'AOA sur Android moderne et alternatives
Objectifs
Faire le tour honnête de ce qui casse (ou non) en 2026 avec la Mega ADK et le protocole AOA, et choisir la bonne alternative selon le projet. Constats sourcés : la carte est retired (page officielle sous docs.arduino.cc/retired, boutique 404) ; la documentation Google ADK a été retirée et redirige vers la page générique « accessoires » ; le wiki historique de l'ADK est un 404 sans archive ; AOAv2 a déprécié l'audio USB dans Android 8.0 ; AOA et MTP ne peuvent pas fonctionner simultanément ; les applications accessoires doivent gérer proprement permission USB et device-detached, et certains téléphones très récents ont des piles USB capricieuses (fils de forum sur des cartes ADK qui énumèrent mais ne s'ouvrent pas). Le protocole AOA lui-même reste documenté (source.android.com) et le mode accessoire est disponible depuis Android 3.1, rétroporté à 2.3.4 : côté API Android, rien n'a disparu.
Matériel
- 1 × Arduino Mega ADK + téléphone Android récent pour les tests de friction
- Pour les alternatives : au choix — carte ESP32-S2/S3 (USB OTG natif), module Bluetooth série (HC-05 côté classique, ou BLE), adaptateur USB-OTG série (FTDI/CP210x/CH34x) + câble OTG vers le téléphone
- Pas de matériel neuf obligatoire : ce tutoriel est une grille de décision + un gabarit Android robuste
Code complet
Gabarit Java de gestion robuste d'un accessoire AOA sur Android moderne (permission, débranchement, reconnexion) :
// AccessoireBridge.java — le minimum vital sur Android récent
public class AccessoireBridge {
private UsbManager mgr; private UsbAccessory acc;
private FileInputStream in; private FileOutputStream out;
public boolean attacher(Intent intent) {
String a = intent.getAction;
if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(a)) {
acc = UsbManager.getAccessory(intent);
if (!mgr.hasPermission(acc)) {
mgr.requestPermission(acc, PendingIntent.getBroadcast(ctx, 0,
new Intent("com.atelier.adk.PERM"), 0));
return false; // reprise après la popup
}
ParcelFileDescriptor pfd = acc.open(mgr, true);
if (pfd == null) return false; // le téléphone refuse parfois
in = new FileInputStream(pfd.getFileDescriptor);
out = new FileOutputStream(pfd.getFileDescriptor);
return true;
}
if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(a)) { detacher; }
return false;
}
public void detacher {
try { if (in != null) in.close; } catch (IOException ignored) { }
try { if (out != null) out.close; } catch (IOException ignored) { }
in = null; out = null; acc = null; // l'UI passe « hors ligne »
}
// Côté manifeste : intent-filter ACCESSORY_ATTACHED + accessory_filter
// (accessory-manufacturer) ; ne JAMAIS envoyer de trame sans out != null.
}
Vérification attendue
Avec la Mega ADK : le téléphone énumère bien en VID 0x18D1 mais l'ouverture du flux peut échouer sur certains modèles récents — le gabarit ci-dessus doit alors afficher « hors ligne » sans crash, et se reconnecter au rebranchement. Si le téléphone bascule en MTP (mode transfert de fichiers par défaut chez beaucoup de fabricants), AOA ne démarre pas : il faut rebrancher en charge seule. Conclusion de la grille : pour un projet neuf, l'AOA sur cette carte retired n'est plus un choix par défaut ; gardez-la pour le host HID et la patrimonialisation, et passez aux alternatives ci-dessous pour le lien téléphone.
Erreurs fréquentes
- Croire qu'AOA est « mort côté Android » : l'API UsbAccessory fonctionne toujours ; c'est l'écosystème ADK (paquet 2011, wiki, docs) qui a disparu, et les piles USB des téléphones qui sont variables.
- Oublier de gérer ACCESSORY_DETACHED et les IOException : sur Android récent, le câble se fait débrancher « électriquement » par le système (passage MTP, économie d'énergie) sans prévenir l'application.
- Utiliser l'audio USB AOAv2 : déprécié depuis Android 8.0 — ne pas bâtir de projet là-dessus.
- Chaîne version absente du descripteur d'accessoire : redémarrage possible des téléphones Android ≤ 10 à l'énumération.
- Alternatives mal choisies : l'adaptateur USB-OTG série (FTDI/CP210x) suppose que le téléphone est l'hôte — l'inverse du modèle AOA — et exige le driver USB-serial-android ; l'ESP32-S2/S3 offre USB natif ET Bluetooth/BLE, et le Bluetooth série ou BLE est presque toujours plus simple qu'AOA en 2026 ; le BLE est la voie sans câble ni permission USB.
- Comparer les débits : AOA 1.0 reste un lien USB pleine vitesse — largement suffisant pour capteurs et commandes ; si votre projet exige du flux vidéo ou audio, changez de famille matérielle.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino