USB host yleiskatsaus

Kun Android-laitteessa on USB-host-tilassa, se toimii USB host, valtuudet linja, ja luettelee liitetyt USB-laitteet. USB-isäntätila on tuettu Android 3.1 ja korkeampi.

API Overview

ennen kuin aloitat, on tärkeää ymmärtää luokat, joiden kanssa sinun on työskenneltävä. Seuraavassa taulukossa kuvataan, USB host Api android.hardware.usb paketti.

Taulukko 1., USB Host Api

Luokan Kuvaus
UsbManager voit luetella ja kommunikoida kytketty USB-laitteita.
UsbDevice On kytketty USB-laite ja sisältää menetelmiä käyttää sen tunnistetietoja, rajapinnat, ja päätepisteet.
UsbInterface Edustaa liitäntä, USB-laite, jossa määritellään joukko toimintoja laitteen., Laitteessa voi olla yksi tai useampi rajapinta, jolla voi kommunikoida.
UsbEndpoint Edustaa käyttöliittymän ominaisuutta, joka on viestinnän kanava, tämä käyttöliittymä. Käyttöliittymä voi olla yksi tai useampia päätepisteitä, ja yleensä on input ja output päätepisteet kaksisuuntainen kommunikointi laitteen kanssa.
UsbDeviceConnection Muodostaa yhteyden laitteeseen, joka siirtää tiedot päätepisteet. Tämän luokan avulla voit lähettää tietoja edestakaisin sykronisesti tai asynkronisesti.,
UsbRequest Edustaa asynkronisen pyynnön kommunikoida laitteen kautta UsbDeviceConnection.
UsbConstants Määrittelee USB vakioita, jotka vastaavat määritelmät linux/usb/ch9.H Linux-ytimen.

useimmissa tilanteissa, sinun täytyy käyttää kaikki nämä luokat (UsbRequest tarvitaan vain, jos olet tekemässä asynkroninen viestintä) kun kommunikoida USB-laitteen., Yleensä, voit hankkia UsbManager hakea haluamasi UsbDevice. Kun saat laitteen, sinun täytyy löytää sopiva UsbInterface ja UsbEndpoint että käyttöliittymä kommunikoida. Kun olet saanut oikean päätepisteen, avaa UsbDeviceConnection kommunikoidaksesi USB-laitteen kanssa.,

Android manifest vaatimukset

seuraavassa luettelossa kerrotaan, mitä sinun täytyy lisätä sovelluksen manifest-tiedostoon, ennen kuin käytät USB host Api:

  • Koska kaikki Android-pohjaisia laitteita ovat taatusti tukevat USB host Api, sisältää <uses-feature> elementti, joka ilmoittaa, että sovellus käyttää android.hardware.usb.host ominaisuus.
  • Aseta sovelluksen VÄHIMMÄISSDK API-tasolle 12 tai korkeammalle. USB-isäntäapit eivät ole läsnä aiemmilla API-tasoilla.,
  • Jos haluat hakemuksesi ilmoituksen liitteenä USB-laitteen, määritä <intent-filter> ja <meta-data> elementti pari android.hardware.usb.action.USB_DEVICE_ATTACHED tahallisuus teidän pääasiallinen toiminta. <meta-data> elementti pistettä ulkoiseen XML resource file joka julistaa tunnistetietoja laite, jonka haluat tunnistaa.

    XML resource file, julistaa <usb-device> elementit USB-laitteet, jotka haluat suodattaa. Seuraava luettelo kuvaa <usb-device>attribuutteja., Yleensä käyttää toimittajan ja tuotteen ID: n, jos haluat suodattaa tietyn laitteen ja käyttää luokan, alaluokan, ja pöytäkirjan jos haluat suodattaa ryhmän USB-laitteet, kuten mass storage-laitteet tai digitaaliset kamerat. Voit määrittää mitään tai kaikki nämä ominaisuudet., Täsmennetään ominaisuudet sopii jokaisen USB-laitteen, joten tee tämä vain, jos sovellus edellyttää sitä:

    • vendor-id
    • product-id
    • class
    • subclass
    • protocol (laite tai käyttöliittymä)

    Tallenna resource file res/xml/ hakemisto. Resurssitiedoston nimi (ilman .xml-laajennuksen) on oltava sama kuin <meta-data> – elementissä määritelty. XML-resurssitiedoston muoto on alla olevassa esimerkissä.,

Manifest ja resource file esimerkkejä

seuraava esimerkki näyttää, näyte ilmeinen ja sen vastaava resource file:

tässä tapauksessa, seuraavat resource-tiedosto tulee tallentaa res/xml/device_filter.xml ja täsmennetään, että mikä tahansa USB-laitteen, jossa on määritelty attribuutteja on suodatettava:

Työskennellä laitteita,

Kun käyttäjät kytke USB-laitteet Android-laitteen, Android-järjestelmä voi määrittää, onko sovellus on kiinnostunut kytketty laite. Jos näin on, voit asettaa yhteyden laitteeseen haluttaessa., Voit tehdä tämän, sinun sovellus on:

  1. Tutustu kytketty USB-laitteita käyttämällä intent-suodatin ilmoituksen, kun käyttäjä muodostaa yhteyden USB-laitteen tai luettelemalla USB-laitteet, jotka on jo yhdistetty.
  2. kysy käyttäjältä lupaa yhteyden muodostamiseen USB-laitteeseen, jos sitä ei ole jo saatu.
  3. kommunikoi USB-laitteen kanssa lukemalla ja kirjoittamalla tietoja sopivista rajapinnan päätepisteistä.,

Löydä laitetta,

sovellus voi löytää USB-laitteita joko käyttämällä intent-suodatin ilmoituksen, kun käyttäjä muodostaa yhteyden laitteen tai luettelemalla USB-laitteet, jotka on jo yhdistetty. Intent-suodattimen käyttäminen on hyödyllistä, jos haluat, että sovelluksesi havaitsee automaattisesti halutun laitteen. Liitettyjen USB-laitteiden luettelointi on hyödyllistä, jos haluat saada luettelon kaikista kytketyistä laitteista tai jos sovelluksesi ei suodattanut tarkoitusta varten.,

Käytä intent-suodatin

on sovellus löytää tietyn USB-laite, voit määrittää intent filter suodatin android.hardware.usb.action.USB_DEVICE_ATTACHED tahallisuus. Yhdessä tämän intent filter, sinun täytyy määrittää resurssi tiedosto, joka määrittää ominaisuuksia USB-laitteen, kuten tuotteen ja toimittajan ID. Kun käyttäjät yhdistävät laitteen, joka vastaa laitteen suodatinta, järjestelmä esittää heille ikkunan, jossa kysytään, haluavatko he käynnistää sovelluksen. Jos käyttäjät hyväksyvät, sovelluksellasi on automaattisesti lupa käyttää laitetta, kunnes laite on irrotettu.,

seuraava esimerkki näyttää, miten julistaa intent filter:

seuraava esimerkki näyttää, miten julistaa vastaava resurssi tiedoston, joka määrittää USB-laitteet, jotka olet kiinnostunut:

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

oman toiminnan, voit saada UsbDevice, joka edustaa kiinnitetty laitteen tarkoitusta, kuten tämä:

Luetella laitteet

Jos hakemus on kiinnostunut tarkastaa kaikki USB-laitteet parhaillaan yhteydessä, kun sovellus on käynnissä, se voi luetella laitteiden bussissa., Käytä getDeviceList() – menetelmää saadaksesi hash-kartan kaikista kytketyistä USB-laitteista. Hasiskartta näppäilee USB-laitteen nimen, jos haluaa hankkia laitteen kartalta.

Jos haluat, voit myös vain saada iteraattorin alkaen hash kartta ja prosessin jokaisen laitteen yksi kerrallaan:

Saada lupaa kommunikoida laitteen kanssa

Ennen kuin kommunikoida USB-laitteen, sovellus on oltava lupaa käyttäjille.,

Huomautus: Jos sovellus käyttää intent-suodatin löytää USB-laitteet, kun ne liitetään, se saa automaattisesti lupaa, jos käyttäjä sallii sovelluksen käsitellä tahallisuus. Jos ei, sinun on pyydettävä lupaa nimenomaisesti sovelluksessasi ennen liittämistä laitteeseen.

Nimenomaisesti pyytää lupaa voi olla tarpeen joissakin tilanteissa, kuten silloin, kun sovellus luetellaan USB-laitteita, jotka ovat jo kytketty ja sitten haluaa kommunikoida yksi. Sinun täytyy tarkistaa lupa käyttää laitetta ennen kuin yrität kommunikoida sen kanssa., Jos et, saat ajonaikaisen virheen, jos käyttäjä on kieltänyt pääsyn laitteeseen.

saadaksesi luvan, luo ensin lähetysvastaanotin. Tämä vastaanotin kuuntelee tarkoitus, että saa lähettää, kun soitat requestPermission(). Puhelun requestPermission() näyttää valintaikkuna käyttäjä pyytää lupaa muodostaa yhteys laitteeseen., Seuraava mallikoodi osoittaa, kuinka luoda broadcast vastaanotin:

Voit rekisteröidä radiovastaanotin, lisää tätä onCreate() menetelmä teidän toiminta:

näyttää valintaikkunan, joka kysyy käyttäjien lupaa yhteyden laitteeseen, soita requestPermission() menetelmä:

Kun käyttäjät vastata dialogi, broadcast vastaanotin vastaanottaa tahallisuus, joka sisältää EXTRA_PERMISSION_GRANTED extra, joka on boolean edustava vastaus. Tarkista tämä ylimääräinen arvo totta ennen liittämistä laitteeseen.,

yhteydenpito laitteen kanssa

yhteydenpito USB-laitteen kanssa voi olla joko synkronista tai asynkronista. Kummassakin tapauksessa sinun pitäisi luoda uusi Lanka, jolla voit suorittaa kaikki tiedonsiirto, joten et estä UI-lankaa. Oikein perustettu viestintä-laitteen, sinun täytyy saada asianmukainen UsbInterface ja UsbEndpoint laitteen, jonka haluat kommunikoida ja lähettää pyyntöjä tätä ominaisuutta, jossa UsbDeviceConnection., Yleensä koodi on:

  • Tarkistaa UsbDevice objektin ominaisuuksia, kuten tuotteen TUNNUS, myyjän TUNNUS tai device class selvittää, onko tai et halua kommunikoida laitteen kanssa.
  • Kun olet varma, että haluat kommunikoida laitteen kanssa, löytää sopiva UsbInterface jota haluat käyttää kommunikoida yhdessä sopiva UsbEndpoint sen käyttöliittymä. Rajapinnoilla voi olla yksi tai useampia päätepisteitä, ja niillä on yleisesti Tulo-ja tuloste-päätetapahtuma kaksisuuntaiseen viestintään.,
  • Kun löydät oikean päätepisteen, avata UsbDeviceConnection tuota ominaisuutta.
  • Toimittavat tiedot, jotka haluat lähettää edelleen päätepisteen bulkTransfer() tai controlTransfer() menetelmä. Sinun pitäisi suorittaa tämä vaihe toisessa langassa, jotta estetään PÄÄKÄYTTÖLANGAN estäminen. Lisätietoja langojen käytöstä Androidissa on prosesseissa ja langoissa.

seuraava koodinpätkä on triviaali tapa tehdä synkroninen tiedonsiirto., Koodin pitäisi olla enemmän logiikkaa oikein löytää oikea käyttöliittymä ja päätepisteet, kommunikoida ja myös pitäisi tehdä siirtää tietoja eri lanka kuin tärkein UI lanka:

lähettää asynkronisesti, käytä UsbRequest luokan initialize ja queue asynkroninen pyynnöstä, sitten odottaa tuloksen, jossa requestWait().,

Päättämisestä kommunikointi laitteen kanssa

Kun olet valmis kommunikoida laitteen kanssa tai jos laite on irrotettu, sulje UsbInterface ja UsbDeviceConnection soittamalla releaseInterface() ja close(). Kuuntelemaan, erillinen rakennus tapahtumia, luoda broadcast vastaanotin, kuten alla:

Luo lähetys-vastaanotin sovelluksen sisällä, ja ei ole ilmeinen, voidaan hakemus käsitellä vain irrottaa tapahtumia, kun se on käynnissä., Näin irralliset tapahtumat lähetetään vain käynnissä olevaan sovellukseen, eikä niitä lähetetä Kaikkiin sovelluksiin.

Share

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *