IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Connexion d'un matériel USB


Sujet :

Composants FMX Delphi

  1. #1
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut Connexion d'un matériel USB
    Bonjour,

    Sur une application Android, je souhaite connaître les informations (ID device connecté, fabricant...) d'un matériel connecté en USB sur mon appareil.

    Je n'ai pas trouvé d'exemples Delphi, la doc fournie par Android est intéressante mais les unités hardware.usb ne sont pas disponibles. J'ai également trouvé cet exemple mais j'ai le même problème d'unités non disponibles.

    Dois-je passer par la classe TJAudioDeviceInfo alors que le matériel connecté ne sera pas forcément un micro ? J'ai tenté sans succès cette piste... Existe-t-il quelque chose de plus générique ?

    Je développe sous Rio 10.3.3

    Je suis à l'écoute de vos conseils

    Lefju

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    AMHA cela passera par les intents, avec des unités comme Android.JNI.Net, Android.JNI.Jatypes, Androidapi.Helpers, androidSDK.Toast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var Intent : JIntent;
    begin
     itent:=TJIntent.Create;
     ....
    mais je ne vois pas plus loin
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Alors, il n'y a pas d'unité pour UsbManager...mais Delphi permet de déclarer les classes Java et de les appeler via JNI.

    La syntaxe est un peu sioux mais pas tant que ça

    si je prend la première ligne de l'exemple Java on a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    ça va donc se traduire par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      manager: JUsbManager;
    begin
      manager := TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.USB_SERVICE);
    end;
    reste à définir JUsbManager et ça tombe bien il est déclaré ici.

    si on compare avec sa déclaration Java, on peut faire le parallèle

    JUsbManager est déclaré comme une Interface, avec une JavaSignature qui indique la classe Java correspondante, mais il faut également une interface JUsbManagerClass qui va correspondre à tous les membres statiques de la classe Java et la TJUsbManager fait le lien entre les deux...d'ailleurs je suis un peu surpris par la déclaration car les méthodes de cette classe ne sont pas statiques...cette déclaration est erronée.

    si je prend cette déclaration partielle, on a bien hasPermission au niveau de JUsbManager car on invoque manager.hasPermission() et non UsbManager.hasPermission() comme une méthode de classe.

    ça me permet d'ailleurs de préciser que le GUID est quelconque, et que l'interface n'a pas besoin d'être complète (contrairement aux Interface sous Windows), on peut ne reprendre que les méthodes dont on a besoin...mais bon si on a tout c'est plus réutilisable.

    ensuite évidemment on est sur des méthodes Java donc pas de type Delphi là dedans, pas même le type String, mais des JString forcément.

    j'aurais préféré une syntaxe comme celle de APKPascal, mais ça n'est pas le cas...et APKPascal n'a pas avancé d'un poil depuis bien longtemps :/

    Bref, une fois qu'on a compris la déclaration en trois parties (JxxxClass, Jxxx et TJxxx) ce n'est pas bcp plus compliqué que d'intégrer une API Windows.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    Bonjour SergioMaster et Paul TOTH,

    Merci pour vos réponses.

    AMHA cela passera par les intents, avec des unités comme Android.JNI.Net, Android.JNI.Jatypes, Androidapi.Helpers, androidSDK.Toast
    J'utilise les Intent Filter pour détecter la connexion d'un matériel USB et je lance l'application si le matériel est autorisé. La documentation Android pour effectuer cette partie est ici.

    La suite de la documentation Android explique ce que tu suggères pour mon problème, à savoir l'utilisation des intent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
    Le problème est que je ne trouve pas de type UsbDevice et UsbManager.EXTRA_DEVICE. Je suis perdu avec ce mélange de notions Java/Pascal...


    Alors, il n'y a pas d'unité pour UsbManager...mais Delphi permet de déclarer les classes Java et de les appeler via JNI.

    La syntaxe est un peu sioux mais pas tant que ça

    si je prend la première ligne de l'exemple Java on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    ça va donc se traduire par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      manager: JUsbManager;
    begin
      manager := TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.USB_SERVICE);
    end;
    reste à définir JUsbManager et ça tombe bien il est déclaré ici.
    Merci Paul pour tes explications: j'ai mon unité android.hardware.usb.UsbManager.pas qui me permettra de gérer le matériel usb. Perso, la notion Java + passerelle vers Delphi n'est pas évidente quand on débute la progr. Android.

  5. #5
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    Je tente de résoudre mon problème mais j'ai l'impression de m'être lancé dans une usine à gaz

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    var
      JavaObject: JObject;
      DeviceList: JHashMap;
      UsbManager: JUSBManager;
      LocalUSBDevice: JUSBDevice;
      LocalUSBInterface: JUSBInterface;
      Iter: Jiterator;
    begin
      JavaObject := SharedActivityContext.getSystemService(TJContext.JavaClass.USB_SERVICE);
      UsbManager := TJUSBManager.Wrap((JavaObject as ILocalObject).GetObjectID);
      if (not Assigned(UsbManager)) then
      begin
        raise Exception.Create('No USB manager adapter present');
      end;
     
      DeviceList := UsbManager.getDeviceList;
      Iter := DeviceList.values.iterator;
      while (Iter.hasNext) do
      begin
        LocalUSBDevice := TJUSBDevice.Wrap((iter.next as ILocalObject).GetObjectID);
        //
        if (LocalUsbDevice.getInterfaceCount > 0) then
        begin
          LocalUsbInterface := LocalUsbDevice.getInterface(0);
     
          // Microphone dispo ?
          if (LocalUsbInterface.getInterfaceClass = TJUsbConstantsUSB_CLASS_AUDIO) then
          begin
            showMessage(JStringToString(DeviceList.toString)) ;
          end;
        end;
      end;
    Est-ce que la méthode que j'utilise est correcte ?

    Je bloque sur 1 point: Comment récupérer le nom du produit (mProductName qui est visible dans DeviceList.toString) ? Je n'arrive pas à atteindre ce champ dans l'objet DeviceList de type JHashMap. Un tuto propose de passer un Integer mais DeviceList.Get attend un JObject, mais lequel ? C'est d'ailleurs ce qui est décrit dans la doc Java.

    Merci pour vos commentaires

Discussions similaires

  1. connexion vers un port usb
    Par Ganondorf dans le forum Programmation et administration système
    Réponses: 5
    Dernier message: 24/10/2007, 20h08
  2. Connexion neuf box clé usb wifi
    Par greg64 dans le forum Windows XP
    Réponses: 1
    Dernier message: 27/02/2007, 17h18
  3. Comment detecter la connexion d'une clé USB
    Par uvealoop dans le forum MFC
    Réponses: 1
    Dernier message: 07/06/2006, 16h57
  4. Intercepter la connexion d'un clavier usb
    Par dus dans le forum MFC
    Réponses: 1
    Dernier message: 07/10/2005, 19h58
  5. connexion wifi et adaptateur usb
    Par HULK dans le forum Hardware
    Réponses: 1
    Dernier message: 10/09/2005, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo