USB-vert oversikt

Når din Android-drevet enheten er i USB-vert-modus, fungerer den som USB-vert, krefter bussen, og nummererer koblet til USB-enheter. USB-vert-modus er støttet i Android 3.1 og høyere.

API Oversikt

Før du begynner, er det viktig å forstå de klasser som du trenger å jobbe med. Følgende tabell beskriver USB host Api i android.hardware.usb pakken.

Tabell 1., USB Host Api

Klassen Beskrivelse
UsbManager Lar deg spesifisere og kommunisere med tilkoblet USB-enheter.
UsbDevice Representerer en tilkoblet USB-enhet og inneholder metoder for å få tilgang til de opplysninger som kan identifisere, grensesnitt, og endepunkter.
UsbInterface Representerer et grensesnitt av en USB-enhet, som definerer et sett av funksjoner for enheten., En enhet kan ha en eller flere grensesnitt som kommuniserer.
UsbEndpoint Representerer et grensesnitt endepunkt, som er en kommunikasjonskanal for dette grensesnittet. Et grensesnitt som kan ha ett eller flere endepunkter, og vanligvis har input og output endepunkter for to-veis kommunikasjon med enheten.
UsbDeviceConnection Representerer en tilkobling til enheten, som overfører data på endepunktene. Denne klassen gir deg mulighet til å sende data frem og tilbake sychronously eller asynkront.,
UsbRequest Representerer en asynkron forespørsel om å kommunisere med en annen enhet via en UsbDeviceConnection.
UsbConstants Definerer USB-konstanter som svarer til definisjonene i linux/usb/ch9.h av Linux-kjernen.

I de fleste situasjoner, du trenger å bruke alle disse klassene (UsbRequest er bare nødvendig hvis du gjør asynkron kommunikasjon) når du kommuniserer med en USB-enheten., Generelt, får du en UsbManager for å hente den ønskede UsbDevice. Når du har enheten, må du finne den riktige UsbInterface og UsbEndpoint av at grensesnitt for å kommunisere på. Når du får riktig endepunkt, åpne en UsbDeviceConnection for å kommunisere med USB-enheten.,

Android manifest krav

følgende liste beskriver hva du trenger å legge til søknaden din er manifest-filen før du arbeider med USB host Api-er:

  • Fordi ikke alle Android-enheter er garantert å støtte USB host Api, inkluderer en <uses-feature> – element som erklærer at programmet bruker android.hardware.usb.host funksjon.
  • Angi minimum SDK av programmet til API-Nivå 12 eller høyere. USB host Api-er er ikke til stede på tidligere API nivåer.,
  • Hvis du vil at programmet skal bli varslet om en tilkoblet USB-enhet, må du angi en <intent-filter> og <meta-data> – element par for android.hardware.usb.action.USB_DEVICE_ATTACHED hensikt i din viktigste aktivitet. <meta-data> – element poeng til en ekstern XML-ressurs-fil som erklærer å identifisere informasjon om enheten du ønsker å oppdage.

    I XML-ressurs-fil, erklærer <usb-device> – elementer for USB-enheter som du vil filtrere. Følgende liste beskriver attributtene til <usb-device>., Generelt, kan du bruke leverandør og produkt-ID hvis du vil filtrere etter en bestemt enhet og bruk klasse, subclass, og protokollen hvis du vil filtrere etter en gruppe av USB-enheter, som masselagringsenheter, eller digitale kameraer. Du kan angi ingen eller alle av disse attributtene., Spesifiserer ingen attributter som passer alle USB-enheter, slik at bare gjøre dette hvis applikasjonen krever det:

    • vendor-id
    • product-id
    • class
    • subclass
    • protocol (enhet eller interface)

    Lagre ressurs-fil i res/xml/ – katalogen. Ressurs-fil (uten .xml-extension) må være den samme som den du er spesifisert i <meta-data> – element. Formatet til XML-ressurs-filen er i eksempelet nedenfor.,

Manifest og ressurs-fil eksempler

følgende eksempel viser et eksempel på manifest-og den tilhørende ressurs-fil:

I dette tilfellet, er følgende ressurser filen skal lagres i res/xml/device_filter.xml, og angir at en USB-enhet med spesifiserte egenskaper bør filtreres:

Arbeide med enheter

Når brukere kobler til USB-enheter til en Android-drevet enhet, Android-systemet kan avgjøre om søknaden er interessert i den tilkoblede enheten. Hvis så, kan du sette opp kommunikasjon med enheten, hvis du ønsker det., For å gjøre dette, vil søknaden din har å:

  1. Oppdag koblet til USB-enheter ved hjelp av en intent-filter for å bli varslet når brukeren kobler en USB-enhet eller en opplisting av USB-enheter som er koblet til.
  2. Spør brukeren om tillatelse til å koble til USB-enheten, hvis det ikke allerede er oppnådd.
  3. Kommunisere med USB-enheten, ved å lese og skrive data på det aktuelle grensesnittet endepunkter.,

Oppdag en enhet

Din søknad kan oppdage USB-enheter, enten ved hjelp av en intent-filter for å bli varslet når brukeren kobler seg til en enhet eller av en opplisting USB-enheter som er koblet til. Ved hjelp av en intent-filter er nyttig hvis du ønsker å være i stand til å ha din søknad automatisk oppdage en ønsket enhet. Opplisting koblet til USB-enheter er nyttig hvis du ønsker å få en liste over alle tilkoblede enheter eller hvis søknaden ikke filter for en hensikt.,

Bruk en intent-filter

Å ha din søknad oppdage en bestemt USB-enhet, kan du angi en intent-filter for å filtrere etter android.hardware.usb.action.USB_DEVICE_ATTACHED hensikter. Sammen med denne hensikt filter, må du angi en ressurs-fil som angir egenskaper for USB-enhet, for eksempel produkt-og leverandør-ID. Når brukere kobler til en enhet som samsvarer med enheten filter, systemet presenterer dem med en dialogboks som spør om de ønsker å starte din søknad. Hvis brukerne aksepterer, vil programmet automatisk har tillatelse til å åpne enheten til enheten er koblet fra.,

følgende eksempel viser hvordan å erklære den hensikt filter:

følgende eksempel viser hvordan å erklære den tilsvarende ressurs-fil som angir USB-enheter som du er interessert i:

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

I aktivitet, kan du få den UsbDevice som representerer den tilkoblede enheten fra den hensikt som dette:

Nummerere enheter

Hvis din søknad er interessert i å undersøke alle USB-enheter som for øyeblikket er koblet mens programmet kjører, det kan nummerere enheter på bussen., Bruk getDeviceList() metode for å få en hash-kart av alle USB-enheter som er koblet til. Hash-kartet er skrevet av USB-enhetens navn hvis du ønsker å få en enhet fra kartet.

Hvis du vil, kan du også bare få tak i en iterator fra hash kart og behandle hver enhet, én etter én:

Få tillatelse til å kommunisere med en enhet

Før du kommunisere med USB-enheten, søknaden må ha tillatelse fra brukerne.,

Merk: Hvis programmet bruker en intent-filter for å oppdage USB-enheter når de er koblet til, er det automatisk får tillatelse hvis brukeren gjør din søknad for å håndtere den hensikt. Hvis ikke, må du be om tillatelse uttrykkelig i søknaden din før du kobler til enheten.

Uttrykkelig å be om tillatelse kan være nødvendig i enkelte situasjoner, for eksempel når søknaden nummererer USB-enheter som er koblet til og deretter ønsker å kommunisere med. Du må sjekke om tillatelse til å få tilgang til en enhet før du prøver å kommunisere med det., Hvis ikke, vil du motta en runtime feil hvis brukeren nektes tillatelse til å få tilgang til den enheten.

for Å få tillatelse, må du først opprette en tv-mottaker. Denne mottakeren lytter etter hensikten som blir kringkastet når du ringer requestPermission(). Kallet til requestPermission() viser en dialogboks for brukeren ber om tillatelse til å koble til enheten., Det følgende eksempelet kode som viser hvordan å lage sendingen mottaker:

for Å registrere broadcast-mottaker, kan du legge denne i din onCreate() metode i din aktivitet:

for Å vise dialogboksen som ber brukeren om tillatelse til å koble til enheten, kan du ringe requestPermission() metode:

Når brukere merknader til dialog, sendingen mottakeren mottar den hensikten som inneholder EXTRA_PERMISSION_GRANTED ekstra, noe som er en boolsk som representerer svaret. Sjekk denne ekstra for verdien true før du kobler til enheten.,

Kommuniserer med en enhet

Kommunikasjon med en USB-enhet kan enten være synkron eller asynkron. I begge tilfeller, bør du opprette en ny tråd på å bære ut alle data overføringer, slik at du ikke blokkere UI tråden. Du skal sette opp kommunikasjon med en enhet, må du få tak i den riktige UsbInterface og UsbEndpoint av enheten som du ønsker å kommunisere på og sende forespørsler på dette endepunktet med en UsbDeviceConnection., Generelt koden din, bør:

  • Se en UsbDevice objektets attributter, for eksempel produkt-ID, leverandør-ID, eller enheten klassen for å finne ut om du ønsker eller ikke ønsker å kommunisere med enheten.
  • Når du er sikker på at du vil kommunisere med enheten, kan du finne det aktuelle UsbInterface som du vil bruke for å kommunisere sammen med de aktuelle UsbEndpoint av at grensesnittet. Grensesnitt kan ha en eller flere endepunkter, og ofte vil ha en input-og output-endepunkt for to-veis kommunikasjon.,
  • Når du finner riktig endepunkt, åpne en UsbDeviceConnection på som endepunkt.
  • oppgi data som du ønsker å overføre på endepunktet med bulkTransfer() eller controlTransfer() metode. Du bør utføre dette trinnet i en annen tråd for å unngå å blokkere den viktigste UI tråden. For mer informasjon om bruk av tråder i Android, se Prosesser og Tråder.

følgende kodebit er en triviell måte å gjøre en synkron overføring av data., Koden bør ha mer logikk for å riktig finne riktig grensesnitt og endepunkter å kommunisere på, og bør også gjøre noen overføring av data i en annen tråd enn de viktigste UI tråden:

for Å sende data asynkront, bruk UsbRequest klassen initialize og queue en asynkron forespørsel, deretter vente på resultatet med requestWait().,

Avslutning av kommunikasjon med en enhet

Når du er ferdig med å kommunisere med enheten, eller hvis enheten var revet, i nærheten UsbInterface og UsbDeviceConnection ved å ringe releaseInterface() og close(). Å lytte for frittliggende hendelser, lage en tv-mottaker som nedenfor:

Opprette broadcast-mottaker i programmet, og ikke manifest, lar programmet til å bare håndtere enebolig hendelser mens den er i gang., Denne måten, enebolig hendelser blir bare sendt til programmet som kjører, og ikke kringkastes til alle programmene.

Share

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *