Når din Android-drevne enheden er i USB-tilstand, fungerer den som USB-vært, beføjelser bussen, og opregner tilsluttede USB-enheder. USB host-tilstand understøttes i Android 3.1 og nyere.
API oversigt
før du begynder, er det vigtigt at forstå de klasser, du skal arbejde med. Følgende tabel beskriver USB host API ‘ er i android.hardware.usb
pakken.
tabel 1., USB-Vært Api
Klasse | Beskrivelse |
---|---|
UsbManager |
Giver dig mulighed for at optælle og kommunikere med tilsluttede USB-enheder. |
UsbDevice |
Repræsenterer en tilsluttet USB-enhed og indeholder metoder til at få adgang til identificerende oplysninger, grænseflader, og endpoints. |
UsbInterface |
repræsenterer en grænseflade af en USB-enhed, der definerer et sæt funktionalitet for enheden., En enhed kan have en eller flere grænseflader til at kommunikere. |
UsbEndpoint |
Repræsenterer et interface endpoint, som er en kommunikationskanal for denne grænseflade. En grænseflade kan have et eller flere endepunkter og har normalt input-og output-endepunkter til tovejskommunikation med enheden. |
UsbDeviceConnection |
repræsenterer en forbindelse til enheden, som overfører data om slutpunkter. Denne klasse giver dig mulighed for at sende data frem og tilbage sykront eller asynkront., |
UsbRequest |
Repræsenterer en asynkron forespørgsel til at kommunikere med en enhed, via en UsbDeviceConnection . |
UsbConstants |
Definerer USB-konstanter, der svarer til definitionerne i linux/usb/ch9.h af Linu. – kernen. |
I de fleste situationer, er du nødt til at bruge alle disse klasser (UsbRequest
er kun nødvendig, hvis du laver asynkron kommunikation) når du kommunikerer med en USB-enhed., Generelt får du en UsbManager
for at hente den ønskede UsbDevice
. Når du har enheden, skal du finde den relevante UsbInterface
og UsbEndpoint
for den grænseflade, der skal kommunikere på. Når du har fået det korrekte slutpunkt, skal du åbne en UsbDeviceConnection
for at kommunikere med USB-enheden.,
Android manifest-krav
Den følgende liste beskriver, hvad du har brug for at tilføje til din ansøgning manifest-filen, før du arbejder med USB host-Api ‘er:
- Fordi ikke alle Android-enheder er garanteret til at understøtte USB host-Api’ er, inkluderer
<uses-feature>
element, der erklærer, at din ansøgning brugerandroid.hardware.usb.host
funktion. - Indstil minimum SDK for applikationen til API-niveau 12 eller højere. USB host API ‘ erne er ikke til stede på tidligere API-niveauer.,
- Hvis du ønsker, at din ansøgning om at blive underrettet på en tilsluttet USB-enhed, skal du angive en
<intent-filter>
og<meta-data>
element-par forandroid.hardware.usb.action.USB_DEVICE_ATTACHED
hensigt i din primære aktivitet. Elementet<meta-data>
peger på en ekstern resourceml-ressourcefil, der erklærer identificerende oplysninger om den enhed, du vil registrere.i resourceml-ressourcefilen skal du erklære
<usb-device>
elementer til de USB-enheder, du vil filtrere. Følgende liste beskriver attributterne til<usb-device>
., Brug generelt leverandør-og Produkt-ID, hvis du vil filtrere efter en bestemt enhed, og brug klasse, underklasse og protokol, hvis du vil filtrere efter en gruppe USB-enheder, såsom masselagringsenheder eller digitale kameraer. Du kan angive Ingen eller alle disse attributter., Angivelse ingen attributter, der matcher enhver USB-enhed, så kun gøre dette, hvis din ansøgning kræver det:vendor-id
product-id
class
subclass
-
protocol
(enhed, eller interface)
Gem ressource-filen i
res/xml/
bibliotek. Ressourcefilnavnet (uden .extensionml-udvidelse) skal være den samme som den, du har angivet i elementet<meta-data>
. Formatet for resourceml-ressourcefilen er i eksemplet nedenfor.,
Manifest og ressource-fil eksempler
Det følgende eksempel viser en stikprøve manifest og den tilsvarende ressource-fil:
I dette tilfælde, følgende ressource-filen skal være gemt i res/xml/device_filter.xml
og angiver, at en USB-enhed med de angivne attributter, der skal filtreres:
Arbejde med enheder
Når brugere tilslutte flere USB-enheder til en Android-baserede enhed, Android-system, der kan afgøre, om din ansøgning er interesseret i den tilsluttede enhed. I så fald kan du konfigurere kommunikation med enheden, hvis det ønskes., For at gøre dette skal din applikation:
- Opdag tilsluttede USB-enheder ved hjælp af et intentionsfilter, der skal meddeles, når brugeren tilslutter en USB-enhed eller ved at opregne USB-enheder, der allerede er tilsluttet.
- Bed brugeren om tilladelse til at oprette forbindelse til USB-enheden, hvis den ikke allerede er opnået.
- Kommuniker med USB-enheden ved at læse og skrive data på de relevante grænsefladeendepunkter.,
opdag en enhed
din applikation kan finde USB-enheder ved enten at bruge et intentionsfilter, der skal meddeles, når brugeren tilslutter en enhed, eller ved at opregne USB-enheder, der allerede er tilsluttet. Brug af et intent-filter er nyttigt, hvis du vil kunne få din applikation automatisk til at registrere en ønsket enhed. Det er nyttigt at opregne tilsluttede USB-enheder, hvis du vil have en liste over alle tilsluttede enheder, eller hvis din applikation ikke filtrerede efter en hensigt.,
brug et intent-filter
for at få din applikation til at opdage en bestemt USB-enhed kan du angive et intent-filter, der skal filtreres for android.hardware.usb.action.USB_DEVICE_ATTACHED
intent. Sammen med dette intent-filter skal du angive en ressourcefil, der angiver egenskaberne for USB-enheden, såsom produkt-og leverandør-ID. Når brugere tilslutter en enhed, der matcher dit enhedsfilter, giver systemet dem en dialogboks, der spørger, om de vil starte din applikation. Hvis brugerne accepterer, har din applikation automatisk tilladelse til at få adgang til enheden, indtil enheden er afbrudt.,
følgende eksempel viser, hvordan man erklærer den hensigt filter:
følgende eksempel viser, hvordan man erklærer den tilsvarende ressource-fil, der angiver de USB-enheder, som du er interesseret i:
<?xml version="1.0" encoding="utf-8"?><resources> <usb-device vendor-id="1234" product-id="5678" /></resources>
I din virksomhed, kan du få den UsbDevice
, der repræsenterer den tilsluttede enhed fra den hensigt, som denne:
Opregne enheder
Hvis din ansøgning er interesseret i at inspicere alle de USB-enheder, der aktuelt er tilsluttet, mens din programmet kører, kan opregne enheder på bussen., Brug getDeviceList()
– metoden til at få et hash-kort over alle de USB-enheder, der er tilsluttet. Hash-kortet indtastes af USB-enhedens navn, hvis du vil hente en enhed fra kortet.
Hvis det ønskes, kan du også bare få et iterator fra hash kort og behandle hver enkelt enhed, en efter en:
Få tilladelse til at kommunikere med en enhed
Før kommunikere med USB-enheden, skal din ansøgning skal have tilladelse fra dine brugere.,Bemærk: Hvis din applikation bruger et intent-filter til at opdage USB-enheder, når de er tilsluttet, modtager den automatisk tilladelse, hvis brugeren tillader, at din applikation håndterer intentionen. Hvis ikke, skal du anmode om tilladelse eksplicit i din applikation, før du opretter forbindelse til enheden.hvis du udtrykkeligt beder om tilladelse, kan det være nødvendigt i nogle situationer, f.eks. når din applikation opregner USB-enheder, der allerede er tilsluttet, og derefter ønsker at kommunikere med en. Du skal kontrollere for tilladelse til at få adgang til en enhed, før du prøver at kommunikere med den., Hvis ikke, modtager du en runtime-fejl, hvis brugeren nægtede tilladelse til at få adgang til enheden.
for eksplicit at få tilladelse skal du først oprette en udsendelsesmodtager. Denne modtager lytter efter den hensigt, der udsendes, når du ringer requestPermission()
. Opkaldet til requestPermission()
viser en dialog til brugeren, der beder om tilladelse til at oprette forbindelse til enheden., Følgende kodeeksempel viser hvordan man skaber den udsendelse modtager:
for At registrere broadcast-modtageren, skal du tilføje dette i din onCreate()
metode i din virksomhed:
for At få vist dialogboksen, der beder brugerne om tilladelse til at oprette forbindelse til den enhed, kalder requestPermission()
metode:
Når brugerne svar til dialog, din broadcast-modtageren modtager den hensigt, der indeholder EXTRA_PERMISSION_GRANTED
ekstra, som er en boolean, der repræsenterer svaret. Tjek dette ekstra for en værdi af true, før du opretter forbindelse til enheden.,
Kommuniker med en enhed
kommunikation med en USB-enhed kan enten være synkron eller asynkron. I begge tilfælde skal du oprette en ny tråd, hvorpå du kan udføre alle dataoverførsler, så du ikke blokerer UI-tråden. Til korrekt at oprette kommunikation med en anden enhed, skal du opnå den relevante UsbInterface
og UsbEndpoint
af den enhed, som du ønsker at kommunikere på og sende anmodninger om dette endpoint med en UsbDeviceConnection
., Generelt skal din kode:
- Check a
UsbDevice
objektets attributter, såsom Produkt-ID, leverandør-ID eller enhedsklasse for at finde ud af, om du vil kommunikere med enheden eller ej. - når du er sikker på, at du vil kommunikere med enheden, skal du finde det relevante
UsbInterface
, som du vil bruge til at kommunikere sammen med det relevanteUsbEndpoint
for den pågældende grænseflade. Grænseflader kan have et eller flere endepunkter, og vil ofte have et input-og output-endepunkt til tovejskommunikation., - når du finder det korrekte slutpunkt, skal du åbne et
UsbDeviceConnection
på det pågældende slutpunkt. - Angiv de data, du vil sende på slutpunktet, med
bulkTransfer()
ellercontrolTransfer()
metoden. Du skal udføre dette trin i en anden tråd for at forhindre blokering af hoved-UI-tråden. For mere information om brug af tråde i Android, Se processer og tråde.
følgende kodestykke er en triviel måde at foretage en synkron dataoverførsel på., Din kode bør have mere logik at korrekt finde det korrekte interface og endpoints til at kommunikere på og også skal gøre, nogen overførsel af data i en anden tråd end den vigtigste UI tråd:
til At sende data asynkront, skal du bruge UsbRequest
klasse initialize
og queue
en asynkron forespørgsel, så vente på resultatet med requestWait()
.,
Afslutning kommunikation med en anden enhed
Når du er færdig med at kommunikere med enheden, eller enheden, hvis den blev afmonteret, lukke UsbInterface
og UsbDeviceConnection
ved at ringe releaseInterface()
og close()
. Hvis du vil lytte efter løsrevne begivenheder, skal du oprette en udsendelsesmodtager som nedenfor:
oprettelse af udsendelsesmodtageren i applikationen og ikke manifestet, giver din applikation kun mulighed for at håndtere løsrevne begivenheder, mens den kører., På denne måde sendes fritliggende begivenheder kun til det program, der kører i øjeblikket og ikke udsendes til alle applikationer.