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 brukerandroid.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 forandroid.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 å:
- 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.
- Spør brukeren om tillatelse til å koble til USB-enheten, hvis det ikke allerede er oppnådd.
- 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 aktuelleUsbEndpoint
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()
ellercontrolTransfer()
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.