présentation de l’hôte USB

lorsque votre appareil Android est en mode hôte USB, il agit comme l’hôte USB, alimente le bus et énumère les périphériques USB connectés. Le mode hôte USB est pris en charge dans Android 3.1 et supérieur.

aperçu de L’API

avant de commencer, il est important de comprendre les classes avec lesquelles vous devez travailler. Le tableau suivant décrit les API D’hôte USB dans le package android.hardware.usb.

le Tableau 1., Hôte USB Api

Class Description
UsbManager Permet d’énumérer et de communiquer avec les périphériques USB connectés.
UsbDevice représente un périphérique USB connecté et contient des méthodes pour accéder à ses informations d’identification, interfaces et points de terminaison.
UsbInterface Représente une interface d’un périphérique USB, qui définit un ensemble de fonctionnalités de l’appareil., Un dispositif peut avoir une ou plusieurs interfaces sur lesquelles communiquer.
UsbEndpoint Représente un point de terminaison de l’interface, qui est un canal de communication pour cette interface. Une interface peut avoir un ou plusieurs points d’extrémité, et a généralement des points d’extrémité d’entrée et de sortie pour une communication bidirectionnelle avec le périphérique.
UsbDeviceConnection Représente une connexion à l’appareil, qui transfère des données sur les ordinateurs d’extrémité. Cette classe vous permet d’envoyer des données de manière synchrone ou asynchrone.,
UsbRequest Représente une requête asynchrone pour communiquer avec un périphérique par le biais d’un UsbDeviceConnection.
UsbConstants Définit USB constantes qui correspondent à des définitions dans linux/usb/ch9.h du noyau Linux.

dans la plupart des situations, vous devez utiliser toutes ces classes (UsbRequest n’est requis que si vous effectuez une communication asynchrone) lors de la communication avec un périphérique USB., En général, vous obtenez un UsbManager pour récupérer le désiré UsbDevice. Lorsque vous avez de l’appareil, vous avez besoin pour trouver le UsbInterface et le UsbEndpoint de cette interface pour communiquer. Une fois que vous obtenez le point de terminaison correct, ouvrez un UsbDeviceConnection pour communiquer avec le périphérique USB.,

exigences du manifeste Android

la liste suivante décrit ce que vous devez ajouter au fichier manifeste de votre application avant de travailler avec les API hôtes USB:

  • étant donné que tous les appareils Android ne sont pas garantis pour prendre en charge les API hôtes USB, incluez un élément<uses-feature> qui déclare
  • définissez le SDK minimum de l’application au niveau API 12 ou supérieur. Les API hôtes USB ne sont pas présentes sur les niveaux D’API antérieurs.,
  • Si vous souhaitez que votre application d’être averti d’un périphérique USB est connecté, spécifiez un <intent-filter> et <meta-data> élément de la paire pour le android.hardware.usb.action.USB_DEVICE_ATTACHED intention dans votre activité principale. L’élément<meta-data> pointe vers un fichier de ressources XML externe qui déclare des informations d’identification sur le périphérique que vous souhaitez détecter.

    dans le fichier de ressources XML, déclarez les éléments<usb-device> pour les périphériques USB que vous souhaitez filtrer. La liste suivante décrit les attributs de <usb-device>., En général, utilisez l’ID du fournisseur et du produit si vous souhaitez filtrer un périphérique spécifique et utilisez la classe, la sous-classe et le protocole si vous souhaitez filtrer un groupe de périphériques USB, tels que des périphériques de stockage de masse ou des appareils photo numériques. Vous pouvez spécifier aucun ou tous ces attributs., Sans spécifier les attributs correspond à tous les périphériques USB, de sorte que si votre application nécessite:

    • vendor-id
    • product-id
    • class
    • subclass
    • protocol (de l’appareil ou de l’interface)

    Enregistrez le fichier de ressources dans le res/xml/ répertoire. Le nom du fichier de Ressource (sans le .xml extension) doit être le même que celui que vous avez spécifié dans l’élément <meta-data>. Le format du fichier de ressources XML se trouve dans l’exemple ci-dessous.,

exemples de manifestes et de fichiers de ressources

l’exemple suivant montre un exemple de manifeste et son fichier de ressources correspondant:

dans ce cas, le fichier de ressources suivant doit être enregistré dans res/xml/device_filter.xml et spécifie que tout périphérique USB avec les attributs spécifiés doit être filtré:

, le système Android peut déterminer si votre application est intéressée par l’appareil connecté. Si oui, vous pouvez établir la communication avec l’appareil si vous le souhaitez., Pour ce faire, votre application doit:

  1. découvrir les périphériques USB connectés en utilisant un filtre d’intention pour être averti lorsque l’utilisateur connecte un périphérique USB ou en énumérant les périphériques USB déjà connectés.
  2. demandez à l’utilisateur l’autorisation de se connecter au périphérique USB, si ce n’est pas déjà obtenu.
  3. communiquez avec le périphérique USB en lisant et en écrivant des données sur les points de terminaison d’interface appropriés.,

découvrir un périphérique

votre application peut découvrir des périphériques USB en utilisant un filtre d’intention pour être averti lorsque l’utilisateur connecte un périphérique ou en énumérant les périphériques USB déjà connectés. L’utilisation d’un filtre d’intention est utile si vous souhaitez que votre application détecte automatiquement un périphérique souhaité. L’énumération des périphériques USB connectés est utile si vous souhaitez obtenir une liste de tous les périphériques connectés ou si votre application n’a pas filtré pour une intention.,

l’Utilisation d’un filtre d’intention

Pour que votre demande de découvrir un particulier périphérique USB, vous pouvez spécifier un filtre d’intention de filtre pour le android.hardware.usb.action.USB_DEVICE_ATTACHED intention. Avec ce filtre d’intention, vous devez spécifier un fichier de ressources qui spécifie les propriétés du périphérique USB, telles que l’ID du produit et du fournisseur. Lorsque les utilisateurs connectent un appareil correspondant à votre filtre d’appareil, le système leur présente une boîte de dialogue leur demandant s’ils souhaitent démarrer votre application. Si les utilisateurs acceptent, votre application a automatiquement l’autorisation d’accéder à l’appareil jusqu’à ce que l’appareil soit déconnecté.,

l’exemple suivant montre comment déclarer le filtre d’intention:

l’exemple suivant montre comment déclarer le fichier de ressources correspondant qui spécifie les périphériques USB qui vous intéressent:

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

dans votre activité, vous pouvez obtenir le UsbDevice qui représente le périphérique énumérer les périphériques

Si votre application souhaite inspecter tous les périphériques USB actuellement connectés pendant l’exécution de votre application, elle peut énumérer les périphériques sur le bus., Utilisez la méthode getDeviceList() pour obtenir une carte de hachage de tous les périphériques USB connectés. La carte de hachage est définie par le nom du périphérique USB si vous souhaitez obtenir un périphérique à partir de la carte.

Si vous le souhaitez, vous pouvez également simplement obtenir un itérateur à partir de la carte de hachage et traiter chaque périphérique un par un:

obtenir l’autorisation de communiquer avec un périphérique

avant de communiquer avec le périphérique USB, votre application doit avoir l’autorisation de vos utilisateurs.,

Remarque: Si votre application utilise un filtre d’intention pour détecter les périphériques USB lorsqu’ils sont connectés, elle reçoit automatiquement l’autorisation si l’utilisateur permet à votre application de gérer l’intention. Sinon, vous devez demander l’autorisation explicitement dans votre application avant de vous connecter à l’appareil.

demander explicitement une autorisation peut être nécessaire dans certaines situations, par exemple lorsque votre application énumère des périphériques USB déjà connectés et souhaite ensuite communiquer avec un. Vous devez vérifier l’autorisation d’accéder à un appareil avant d’essayer de communiquer avec lui., Si non, vous recevrez une erreur d’exécution si l’utilisateur a refusé l’autorisation d’accéder à l’appareil.

pour obtenir explicitement l’autorisation, créez d’abord un récepteur de diffusion. Ce récepteur écoute l’intention qui est diffusée lorsque vous appelez requestPermission(). L’appel à requestPermission() affiche une boîte de dialogue à l’utilisateur demandant l’autorisation de se connecter au périphérique., L’exemple de code suivant montre comment créer le récepteur de diffusion:

pour enregistrer le récepteur de diffusion, ajoutez ceci dans votre onCreate() méthode dans votre activité:

pour afficher la boîte de dialogue qui demande aux utilisateurs l’autorisation de se connecter à l’appareil, appelez la requestPermission() méthode:

le EXTRA_PERMISSION_GRANTED extra, qui est un booléen représentant la réponse. Vérifiez cette valeur supplémentaire pour une valeur de true avant de vous connecter à l’appareil.,

Communiquer avec un périphérique

la Communication avec un périphérique USB peut être synchrone ou asynchrone. Dans les deux cas, vous devez créer un nouveau thread pour mener toutes les transmissions de données, afin de ne pas bloquer le thread d’INTERFACE utilisateur. Pour bien établir la communication avec un périphérique, vous devez obtenir l’approprié UsbInterface et UsbEndpoint de l’appareil que vous souhaitez communiquer et envoyer des demandes sur ce critère avec un UsbDeviceConnection., En général, votre code doit:

  • vérifiez les attributs d’un objet UsbDevice, tels que l’ID du produit, l’ID du fournisseur ou la classe de périphérique pour savoir si vous souhaitez ou non communiquer avec le périphérique.
  • Lorsque vous êtes certain que vous voulez communiquer avec le périphérique, à trouver le UsbInterface que vous souhaitez utiliser pour communiquer avec les UsbEndpoint de cette interface. Les Interfaces peuvent avoir un ou plusieurs points de terminaison, et généralement auront un point de terminaison d’entrée et de sortie pour la communication bidirectionnelle.,
  • lorsque vous trouvez le point de terminaison correct, ouvrez un UsbDeviceConnection sur ce point de terminaison.
  • fournir les données que vous souhaitez transmettre sur le point de terminaison avec la balise bulkTransfer() ou controlTransfer() méthode. Vous devez effectuer cette étape dans un autre thread pour éviter de bloquer le thread principal de l’interface utilisateur. Pour plus d’informations sur L’utilisation des threads dans Android, consultez processus et Threads.

L’extrait de code suivant est un banal moyen de faire un transfert synchrone des données., Votre code devrait avoir plus de logique pour trouver correctement l’interface et les points de terminaison corrects sur lesquels communiquer et devrait également effectuer tout transfert de données dans un thread différent du thread D’interface utilisateur principal:

pour envoyer des données de manière asynchrone, utilisez la classe UsbRequest à iv id= »demandez, puis attendez le résultat avecrequestWait().,

la Résiliation de la communication avec un périphérique

Lorsque vous avez terminé de communiquer avec un appareil ou si l’appareil a été détaché, fermer la balise UsbInterface et UsbDeviceConnection en appelant releaseInterface() et close(). Pour écouter les événements détachés, créez un récepteur de diffusion comme ci-dessous:

la création du récepteur de diffusion dans l’application, et non du Manifeste, permet à votre application de gérer uniquement les événements détachés pendant son exécution., De cette façon, les événements détachés ne sont envoyés qu’à l’application en cours d’exécution et ne sont pas diffusés sur toutes les applications.

Share

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *