USB host-overblik

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 bruger android.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 for android.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:

  1. 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.
  2. Bed brugeren om tilladelse til at oprette forbindelse til USB-enheden, hvis den ikke allerede er opnået.
  3. 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 aUsbDevice 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 relevante UsbEndpoint 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() eller controlTransfer() 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.

Share

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *